diff --git a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java index 88cd622d..0abf7c0e 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java @@ -19,6 +19,7 @@ import org.qortal.crosschain.AddressInfo; import org.qortal.crosschain.Bitcoin; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.SimpleTransaction; +import org.qortal.crosschain.ServerConfigurationInfo; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -283,4 +284,24 @@ public class CrossChainBitcoinResource { return spendTransaction.getTxId().toString(); } + @GET + @Path("/serverinfos") + @Operation( + summary = "Returns current Bitcoin server configuration", + description = "Returns current Bitcoin server locations and use status", + responses = { + @ApiResponse( + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConfigurationInfo.class + ) + ) + ) + } + ) + public ServerConfigurationInfo getServerConfiguration() { + + return CrossChainUtils.buildServerConfigurationInfo(Bitcoin.getInstance()); + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java index 3ab944ab..e675200b 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java @@ -19,6 +19,7 @@ import org.qortal.crosschain.AddressInfo; import org.qortal.crosschain.Digibyte; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.SimpleTransaction; +import org.qortal.crosschain.ServerConfigurationInfo; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -283,4 +284,24 @@ public class CrossChainDigibyteResource { return spendTransaction.getTxId().toString(); } + @GET + @Path("/serverinfos") + @Operation( + summary = "Returns current Digibyte server configuration", + description = "Returns current Digibyte server locations and use status", + responses = { + @ApiResponse( + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConfigurationInfo.class + ) + ) + ) + } + ) + public ServerConfigurationInfo getServerConfiguration() { + + return CrossChainUtils.buildServerConfigurationInfo(Digibyte.getInstance()); + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java index b66b5716..e292f8e2 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java @@ -19,6 +19,7 @@ import org.qortal.crosschain.AddressInfo; import org.qortal.crosschain.Dogecoin; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.SimpleTransaction; +import org.qortal.crosschain.ServerConfigurationInfo; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -283,4 +284,24 @@ public class CrossChainDogecoinResource { return spendTransaction.getTxId().toString(); } + @GET + @Path("/serverinfos") + @Operation( + summary = "Returns current Dogecoin server configuration", + description = "Returns current Dogecoin server locations and use status", + responses = { + @ApiResponse( + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConfigurationInfo.class + ) + ) + ) + } + ) + public ServerConfigurationInfo getServerConfiguration() { + + return CrossChainUtils.buildServerConfigurationInfo(Dogecoin.getInstance()); + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java index 53274f1e..38a8a598 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java @@ -19,6 +19,7 @@ import org.qortal.crosschain.AddressInfo; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.Litecoin; import org.qortal.crosschain.SimpleTransaction; +import org.qortal.crosschain.ServerConfigurationInfo; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -283,4 +284,24 @@ public class CrossChainLitecoinResource { return spendTransaction.getTxId().toString(); } + @GET + @Path("/serverinfos") + @Operation( + summary = "Returns current Litecoin server configuration", + description = "Returns current Litecoin server locations and use status", + responses = { + @ApiResponse( + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConfigurationInfo.class + ) + ) + ) + } + ) + public ServerConfigurationInfo getServerConfiguration() { + + return CrossChainUtils.buildServerConfigurationInfo(Litecoin.getInstance()); + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java b/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java index 7f2e8402..0e29e892 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java @@ -16,6 +16,7 @@ import org.qortal.api.model.crosschain.PirateChainSendRequest; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.PirateChain; import org.qortal.crosschain.SimpleTransaction; +import org.qortal.crosschain.ServerConfigurationInfo; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -329,4 +330,25 @@ public class CrossChainPirateChainResource { throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE, e.getMessage()); } } + + @GET + @Path("/serverinfos") + @Operation( + summary = "Returns current PirateChain server configuration", + description = "Returns current PirateChain server locations and use status", + responses = { + @ApiResponse( + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConfigurationInfo.class + ) + ) + ) + } + ) + public ServerConfigurationInfo getServerConfiguration() { + + return CrossChainUtils.buildServerConfigurationInfo(PirateChain.getInstance()); + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java index 4d3f204d..64ebc136 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java @@ -19,6 +19,7 @@ import org.qortal.crosschain.AddressInfo; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.Ravencoin; import org.qortal.crosschain.SimpleTransaction; +import org.qortal.crosschain.ServerConfigurationInfo; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -283,4 +284,24 @@ public class CrossChainRavencoinResource { return spendTransaction.getTxId().toString(); } + @GET + @Path("/serverinfos") + @Operation( + summary = "Returns current Ravencoin server configuration", + description = "Returns current Ravencoin server locations and use status", + responses = { + @ApiResponse( + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConfigurationInfo.class + ) + ) + ) + } + ) + public ServerConfigurationInfo getServerConfiguration() { + + return CrossChainUtils.buildServerConfigurationInfo(Ravencoin.getInstance()); + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainUtils.java b/src/main/java/org/qortal/api/resource/CrossChainUtils.java new file mode 100644 index 00000000..d45ba257 --- /dev/null +++ b/src/main/java/org/qortal/api/resource/CrossChainUtils.java @@ -0,0 +1,47 @@ +package org.qortal.api.resource; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.qortal.crosschain.*; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class CrossChainUtils { + private static final Logger LOGGER = LogManager.getLogger(CrossChainUtils.class); + + public static ServerConfigurationInfo buildServerConfigurationInfo(Bitcoiny blockchain) { + + BitcoinyBlockchainProvider blockchainProvider = blockchain.getBlockchainProvider(); + ChainableServer currentServer = blockchainProvider.getCurrentServer(); + + return new ServerConfigurationInfo( + buildInfos(blockchainProvider.getServers(), currentServer), + buildInfos(blockchainProvider.getRemainingServers(), currentServer), + buildInfos(blockchainProvider.getUselessServers(), currentServer) + ); + } + + public static ServerInfo buildInfo(ChainableServer server, boolean isCurrent) { + return new ServerInfo( + server.averageResponseTime(), + server.getHostName(), + server.getPort(), + server.getConnectionType().toString(), + isCurrent); + + } + + public static List buildInfos(Collection servers, ChainableServer currentServer) { + + List infos = new ArrayList<>( servers.size() ); + + for( ChainableServer server : servers ) + { + infos.add(buildInfo(server, server.equals(currentServer))); + } + + return infos; + } +} diff --git a/src/main/java/org/qortal/crosschain/Bitcoin.java b/src/main/java/org/qortal/crosschain/Bitcoin.java index 801b141c..b2a016e7 100644 --- a/src/main/java/org/qortal/crosschain/Bitcoin.java +++ b/src/main/java/org/qortal/crosschain/Bitcoin.java @@ -7,7 +7,7 @@ import org.bitcoinj.params.MainNetParams; import org.bitcoinj.params.RegTestParams; import org.bitcoinj.params.TestNet3Params; import org.qortal.crosschain.ElectrumX.Server; -import org.qortal.crosschain.ElectrumX.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.settings.Settings; import java.util.Arrays; diff --git a/src/main/java/org/qortal/crosschain/BitcoinyBlockchainProvider.java b/src/main/java/org/qortal/crosschain/BitcoinyBlockchainProvider.java index d8b4f653..238eff38 100644 --- a/src/main/java/org/qortal/crosschain/BitcoinyBlockchainProvider.java +++ b/src/main/java/org/qortal/crosschain/BitcoinyBlockchainProvider.java @@ -3,6 +3,7 @@ package org.qortal.crosschain; import cash.z.wallet.sdk.rpc.CompactFormats.CompactBlock; import java.util.List; +import java.util.Set; public abstract class BitcoinyBlockchainProvider { @@ -59,4 +60,11 @@ public abstract class BitcoinyBlockchainProvider { /** Broadcasts raw, serialized, transaction bytes to network, returning success/failure. */ public abstract void broadcastTransaction(byte[] rawTransaction) throws ForeignBlockchainException; + public abstract Set getServers(); + + public abstract List getRemainingServers(); + + public abstract Set getUselessServers(); + + public abstract ChainableServer getCurrentServer(); } diff --git a/src/main/java/org/qortal/crosschain/ChainableServer.java b/src/main/java/org/qortal/crosschain/ChainableServer.java new file mode 100644 index 00000000..ac29e5f9 --- /dev/null +++ b/src/main/java/org/qortal/crosschain/ChainableServer.java @@ -0,0 +1,15 @@ +package org.qortal.crosschain; + +public interface ChainableServer { + public void addResponseTime(long responseTime); + + public long averageResponseTime(); + + public String getHostName(); + + public int getPort(); + + public ConnectionType getConnectionType(); + + public enum ConnectionType {TCP, SSL} +} diff --git a/src/main/java/org/qortal/crosschain/Digibyte.java b/src/main/java/org/qortal/crosschain/Digibyte.java index 4e725e89..bda6c18d 100644 --- a/src/main/java/org/qortal/crosschain/Digibyte.java +++ b/src/main/java/org/qortal/crosschain/Digibyte.java @@ -7,7 +7,7 @@ import org.bitcoinj.params.RegTestParams; import org.bitcoinj.params.TestNet3Params; import org.libdohj.params.DigibyteMainNetParams; import org.qortal.crosschain.ElectrumX.Server; -import org.qortal.crosschain.ElectrumX.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.settings.Settings; import java.util.Arrays; diff --git a/src/main/java/org/qortal/crosschain/Dogecoin.java b/src/main/java/org/qortal/crosschain/Dogecoin.java index 93941c41..c687ca60 100644 --- a/src/main/java/org/qortal/crosschain/Dogecoin.java +++ b/src/main/java/org/qortal/crosschain/Dogecoin.java @@ -6,7 +6,7 @@ import org.bitcoinj.core.NetworkParameters; import org.libdohj.params.DogecoinMainNetParams; import org.libdohj.params.DogecoinTestNet3Params; import org.qortal.crosschain.ElectrumX.Server; -import org.qortal.crosschain.ElectrumX.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.settings.Settings; import java.util.Arrays; diff --git a/src/main/java/org/qortal/crosschain/ElectrumX.java b/src/main/java/org/qortal/crosschain/ElectrumX.java index 5915ba04..27e140e2 100644 --- a/src/main/java/org/qortal/crosschain/ElectrumX.java +++ b/src/main/java/org/qortal/crosschain/ElectrumX.java @@ -43,12 +43,11 @@ public class ElectrumX extends BitcoinyBlockchainProvider { private static final String VERBOSE_TRANSACTIONS_UNSUPPORTED_MESSAGE = "verbose transactions are currently unsupported"; private static final int RESPONSE_TIME_READINGS = 5; - private static final long MAX_AVG_RESPONSE_TIME = 1000L; // ms + private static final long MAX_AVG_RESPONSE_TIME = 2000L; // ms - public static class Server { + public static class Server implements ChainableServer { String hostname; - public enum ConnectionType { TCP, SSL } ConnectionType connectionType; int port; @@ -60,6 +59,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { this.port = port; } + @Override public void addResponseTime(long responseTime) { while (this.responseTimes.size() > RESPONSE_TIME_READINGS) { this.responseTimes.remove(0); @@ -67,6 +67,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { this.responseTimes.add(responseTime); } + @Override public long averageResponseTime() { if (this.responseTimes.size() < RESPONSE_TIME_READINGS) { // Not enough readings yet @@ -79,6 +80,21 @@ public class ElectrumX extends BitcoinyBlockchainProvider { return 0L; } + @Override + public String getHostName() { + return this.hostname; + } + + @Override + public int getPort() { + return this.port; + } + + @Override + public ConnectionType getConnectionType() { + return this.connectionType; + } + @Override public boolean equals(Object other) { if (other == this) @@ -104,9 +120,9 @@ public class ElectrumX extends BitcoinyBlockchainProvider { return String.format("%s:%s:%d", this.connectionType.name(), this.hostname, this.port); } } - private Set servers = new HashSet<>(); - private List remainingServers = new ArrayList<>(); - private Set uselessServers = Collections.synchronizedSet(new HashSet<>()); + private Set servers = new HashSet<>(); + private List remainingServers = new ArrayList<>(); + private Set uselessServers = Collections.synchronizedSet(new HashSet<>()); private final String netId; private final String expectedGenesisHash; @@ -114,7 +130,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { private Bitcoiny blockchain; private final Object serverLock = new Object(); - private Server currentServer; + private ChainableServer currentServer; private Socket socket; private Scanner scanner; private int nextId = 1; @@ -638,7 +654,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { if (!this.remainingServers.isEmpty()) { long averageResponseTime = this.currentServer.averageResponseTime(); if (averageResponseTime > MAX_AVG_RESPONSE_TIME) { - LOGGER.info("Slow average response time {}ms from {} - trying another server...", averageResponseTime, this.currentServer.hostname); + LOGGER.info("Slow average response time {}ms from {} - trying another server...", averageResponseTime, this.currentServer.getHostName()); this.closeServer(); break; } @@ -663,20 +679,20 @@ public class ElectrumX extends BitcoinyBlockchainProvider { return true; while (!this.remainingServers.isEmpty()) { - Server server = this.remainingServers.remove(RANDOM.nextInt(this.remainingServers.size())); + ChainableServer server = this.remainingServers.remove(RANDOM.nextInt(this.remainingServers.size())); LOGGER.trace(() -> String.format("Connecting to %s", server)); try { - SocketAddress endpoint = new InetSocketAddress(server.hostname, server.port); + SocketAddress endpoint = new InetSocketAddress(server.getHostName(), server.getPort()); int timeout = 5000; // ms this.socket = new Socket(); this.socket.connect(endpoint, timeout); this.socket.setTcpNoDelay(true); - if (server.connectionType == Server.ConnectionType.SSL) { + if (server.getConnectionType() == Server.ConnectionType.SSL) { SSLSocketFactory factory = TrustlessSSLSocketFactory.getSocketFactory(); - this.socket = factory.createSocket(this.socket, server.hostname, server.port, true); + this.socket = factory.createSocket(this.socket, server.getHostName(), server.getPort(), true); } this.scanner = new Scanner(this.socket.getInputStream()); @@ -832,7 +848,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { * Closes connection to server if it is currently connected server. * @param server */ - private void closeServer(Server server) { + private void closeServer(ChainableServer server) { synchronized (this.serverLock) { if (this.currentServer == null || !this.currentServer.equals(server)) return; @@ -857,4 +873,24 @@ public class ElectrumX extends BitcoinyBlockchainProvider { } } + @Override + public Set getServers() { + LOGGER.info("getting servers"); + return servers; + } + + @Override + public List getRemainingServers() { + return remainingServers; + } + + @Override + public Set getUselessServers() { + return uselessServers; + } + + @Override + public ChainableServer getCurrentServer() { + return currentServer; + } } diff --git a/src/main/java/org/qortal/crosschain/Litecoin.java b/src/main/java/org/qortal/crosschain/Litecoin.java index a0f7c1cb..d87cd1a1 100644 --- a/src/main/java/org/qortal/crosschain/Litecoin.java +++ b/src/main/java/org/qortal/crosschain/Litecoin.java @@ -7,7 +7,7 @@ import org.libdohj.params.LitecoinMainNetParams; import org.libdohj.params.LitecoinRegTestParams; import org.libdohj.params.LitecoinTestNet3Params; import org.qortal.crosschain.ElectrumX.Server; -import org.qortal.crosschain.ElectrumX.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.settings.Settings; import java.util.Arrays; diff --git a/src/main/java/org/qortal/crosschain/PirateChain.java b/src/main/java/org/qortal/crosschain/PirateChain.java index 6587baca..3f3cba47 100644 --- a/src/main/java/org/qortal/crosschain/PirateChain.java +++ b/src/main/java/org/qortal/crosschain/PirateChain.java @@ -13,7 +13,7 @@ import org.libdohj.params.PirateChainMainNetParams; import org.qortal.api.model.crosschain.PirateChainSendRequest; import org.qortal.controller.PirateChainWalletController; import org.qortal.crosschain.PirateLightClient.Server; -import org.qortal.crosschain.PirateLightClient.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.crypto.Crypto; import org.qortal.settings.Settings; import org.qortal.transform.TransformationException; diff --git a/src/main/java/org/qortal/crosschain/PirateLightClient.java b/src/main/java/org/qortal/crosschain/PirateLightClient.java index be4370a0..ae7c3cc1 100644 --- a/src/main/java/org/qortal/crosschain/PirateLightClient.java +++ b/src/main/java/org/qortal/crosschain/PirateLightClient.java @@ -30,10 +30,9 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { private static final int RESPONSE_TIME_READINGS = 5; private static final long MAX_AVG_RESPONSE_TIME = 500L; // ms - public static class Server { + public static class Server implements ChainableServer{ String hostname; - public enum ConnectionType { TCP, SSL } ConnectionType connectionType; int port; @@ -64,6 +63,21 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { return 0L; } + @Override + public String getHostName() { + return this.hostname; + } + + @Override + public int getPort() { + return this.port; + } + + @Override + public ChainableServer.ConnectionType getConnectionType() { + return this.connectionType; + } + @Override public boolean equals(Object other) { if (other == this) @@ -89,9 +103,9 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { return String.format("%s:%s:%d", this.connectionType.name(), this.hostname, this.port); } } - private Set servers = new HashSet<>(); - private List remainingServers = new ArrayList<>(); - private Set uselessServers = Collections.synchronizedSet(new HashSet<>()); + private Set servers = new HashSet<>(); + private List remainingServers = new ArrayList<>(); + private Set uselessServers = Collections.synchronizedSet(new HashSet<>()); private final String netId; private final String expectedGenesisHash; @@ -99,7 +113,7 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { private Bitcoiny blockchain; private final Object serverLock = new Object(); - private Server currentServer; + private ChainableServer currentServer; private ManagedChannel channel; private int nextId = 1; @@ -525,6 +539,24 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { throw new ForeignBlockchainException.NetworkException(String.format("Unexpected error code from Pirate Chain broadcastTransaction gRPC: %d", sendResponse.getErrorCode())); } + @Override + public Set getServers() { + return this.servers; + } + + @Override + public List getRemainingServers() { + return this.remainingServers; + } + + @Override + public Set getUselessServers() { + return this.uselessServers; + } + + @Override + public ChainableServer getCurrentServer() { return this.currentServer; } + // Class-private utility methods @@ -544,7 +576,7 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { if (!this.remainingServers.isEmpty()) { long averageResponseTime = this.currentServer.averageResponseTime(); if (averageResponseTime > MAX_AVG_RESPONSE_TIME) { - LOGGER.info("Slow average response time {}ms from {} - trying another server...", averageResponseTime, this.currentServer.hostname); + LOGGER.info("Slow average response time {}ms from {} - trying another server...", averageResponseTime, this.currentServer.getHostName()); this.closeServer(); continue; } @@ -568,11 +600,11 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { return true; while (!this.remainingServers.isEmpty()) { - Server server = this.remainingServers.remove(RANDOM.nextInt(this.remainingServers.size())); + ChainableServer server = this.remainingServers.remove(RANDOM.nextInt(this.remainingServers.size())); LOGGER.trace(() -> String.format("Connecting to %s", server)); try { - this.channel = ManagedChannelBuilder.forAddress(server.hostname, server.port).build(); + this.channel = ManagedChannelBuilder.forAddress(server.getHostName(), server.getPort()).build(); CompactTxStreamerGrpc.CompactTxStreamerBlockingStub stub = CompactTxStreamerGrpc.newBlockingStub(this.channel); LightdInfo lightdInfo = stub.getLightdInfo(Empty.newBuilder().build()); @@ -604,7 +636,7 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { * Closes connection to server if it is currently connected server. * @param server */ - private void closeServer(Server server) { + private void closeServer(ChainableServer server) { synchronized (this.serverLock) { if (this.currentServer == null || !this.currentServer.equals(server) || this.channel == null) { return; diff --git a/src/main/java/org/qortal/crosschain/Ravencoin.java b/src/main/java/org/qortal/crosschain/Ravencoin.java index 6b267a00..d9301f48 100644 --- a/src/main/java/org/qortal/crosschain/Ravencoin.java +++ b/src/main/java/org/qortal/crosschain/Ravencoin.java @@ -7,7 +7,7 @@ import org.bitcoinj.params.RegTestParams; import org.bitcoinj.params.TestNet3Params; import org.libdohj.params.RavencoinMainNetParams; import org.qortal.crosschain.ElectrumX.Server; -import org.qortal.crosschain.ElectrumX.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.settings.Settings; import java.util.Arrays; diff --git a/src/main/java/org/qortal/crosschain/ServerConfigurationInfo.java b/src/main/java/org/qortal/crosschain/ServerConfigurationInfo.java new file mode 100644 index 00000000..89674ba5 --- /dev/null +++ b/src/main/java/org/qortal/crosschain/ServerConfigurationInfo.java @@ -0,0 +1,60 @@ +package org.qortal.crosschain; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import java.util.List; +import java.util.Objects; + +@XmlAccessorType(XmlAccessType.FIELD) +public class ServerConfigurationInfo { + + private List servers; + private List remainingServers; + private List uselessServers; + + public ServerConfigurationInfo() { + } + + public ServerConfigurationInfo( + List servers, + List remainingServers, + List uselessServers) { + this.servers = servers; + this.remainingServers = remainingServers; + this.uselessServers = uselessServers; + } + + public List getServers() { + return servers; + } + + public List getRemainingServers() { + return remainingServers; + } + + public List getUselessServers() { + return uselessServers; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ServerConfigurationInfo that = (ServerConfigurationInfo) o; + return Objects.equals(servers, that.servers) && Objects.equals(remainingServers, that.remainingServers) && Objects.equals(uselessServers, that.uselessServers); + } + + @Override + public int hashCode() { + return Objects.hash(servers, remainingServers, uselessServers); + } + + @Override + public String toString() { + return "ServerConfigurationInfo{" + + "servers=" + servers + + ", remainingServers=" + remainingServers + + ", uselessServers=" + uselessServers + + '}'; + } +} diff --git a/src/main/java/org/qortal/crosschain/ServerInfo.java b/src/main/java/org/qortal/crosschain/ServerInfo.java new file mode 100644 index 00000000..0efe510b --- /dev/null +++ b/src/main/java/org/qortal/crosschain/ServerInfo.java @@ -0,0 +1,74 @@ +package org.qortal.crosschain; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import java.util.Objects; + +@XmlAccessorType(XmlAccessType.FIELD) +public class ServerInfo { + + private long averageResponseTime; + + private String hostName; + + private int port; + + private String connectionType; + + private boolean isCurrent; + + public ServerInfo() { + } + + public ServerInfo(long averageResponseTime, String hostName, int port, String connectionType, boolean isCurrent) { + this.averageResponseTime = averageResponseTime; + this.hostName = hostName; + this.port = port; + this.connectionType = connectionType; + this.isCurrent = isCurrent; + } + + public long getAverageResponseTime() { + return averageResponseTime; + } + + public String getHostName() { + return hostName; + } + + public int getPort() { + return port; + } + + public String getConnectionType() { + return connectionType; + } + + public boolean isCurrent() { + return isCurrent; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ServerInfo that = (ServerInfo) o; + return averageResponseTime == that.averageResponseTime && port == that.port && isCurrent == that.isCurrent && Objects.equals(hostName, that.hostName) && Objects.equals(connectionType, that.connectionType); + } + + @Override + public int hashCode() { + return Objects.hash(averageResponseTime, hostName, port, connectionType, isCurrent); + } + + @Override + public String toString() { + return "ServerInfo{" + + "averageResponseTime=" + averageResponseTime + + ", hostName='" + hostName + '\'' + + ", port=" + port + + ", connectionType='" + connectionType + '\'' + + ", isCurrent=" + isCurrent + + '}'; + } +} diff --git a/src/test/java/org/qortal/test/crosschain/ElectrumXTests.java b/src/test/java/org/qortal/test/crosschain/ElectrumXTests.java index c4c0acf1..7824a4a2 100644 --- a/src/test/java/org/qortal/test/crosschain/ElectrumXTests.java +++ b/src/test/java/org/qortal/test/crosschain/ElectrumXTests.java @@ -9,7 +9,7 @@ import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider; import org.junit.Test; import org.qortal.crosschain.Bitcoin.BitcoinNet; import org.qortal.crosschain.*; -import org.qortal.crosschain.ElectrumX.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.utils.BitTwiddling; import java.security.Security;