Improve SupportedBlockchain enum

This commit is contained in:
catbref 2020-12-01 15:02:58 +00:00
parent ddb55210b4
commit 75a265f89a
2 changed files with 45 additions and 47 deletions

View File

@ -93,8 +93,7 @@ public class CrossChainResource {
List<CrossChainTradeData> crossChainTradesData = new ArrayList<>();
try (final Repository repository = RepositoryManager.getRepository()) {
for (SupportedBlockchain blockchain : SupportedBlockchain.values()) {
Map<ByteArray, Supplier<ACCT>> acctsByCodeHash = blockchain.getAcctMap();
Map<ByteArray, Supplier<ACCT>> acctsByCodeHash = SupportedBlockchain.getAcctMap();
for (Map.Entry<ByteArray, Supplier<ACCT>> acctInfo : acctsByCodeHash.entrySet()) {
byte[] codeHash = acctInfo.getKey().value;
@ -107,7 +106,6 @@ public class CrossChainResource {
crossChainTradesData.add(crossChainTradeData);
}
}
}
return crossChainTradesData;
} catch (DataException e) {
@ -168,8 +166,7 @@ public class CrossChainResource {
List<CrossChainTradeSummary> crossChainTrades = new ArrayList<>();
for (SupportedBlockchain blockchain : SupportedBlockchain.values()) {
Map<ByteArray, Supplier<ACCT>> acctsByCodeHash = blockchain.getAcctMap();
Map<ByteArray, Supplier<ACCT>> acctsByCodeHash = SupportedBlockchain.getAcctMap();
for (Map.Entry<ByteArray, Supplier<ACCT>> acctInfo : acctsByCodeHash.entrySet()) {
byte[] codeHash = acctInfo.getKey().value;
@ -189,7 +186,6 @@ public class CrossChainResource {
crossChainTrades.add(crossChainTradeSummary);
}
}
}
return crossChainTrades;
} catch (DataException e) {

View File

@ -1,11 +1,10 @@
package org.qortal.crosschain;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.qortal.utils.ByteArray;
import org.qortal.utils.Triple;
@ -14,6 +13,7 @@ public enum SupportedBlockchain {
BITCOIN(Arrays.asList(
Triple.valueOf(BitcoinACCTv1.NAME, BitcoinACCTv1.CODE_BYTES_HASH, BitcoinACCTv1::getInstance)
// Could add improved BitcoinACCTv2 here in the future
)) {
@Override
public ForeignBlockchain getInstance() {
@ -40,45 +40,47 @@ public enum SupportedBlockchain {
}
};
private final Map<ByteArray, Supplier<ACCT>> supportedAcctsByCodeHash = new HashMap<>();
private final Map<String, Supplier<ACCT>> supportedAcctsByName = new HashMap<>();
private static final Map<ByteArray, Supplier<ACCT>> supportedAcctsByCodeHash = Arrays.stream(SupportedBlockchain.values())
.map(supportedBlockchain -> supportedBlockchain.supportedAccts)
.flatMap(List::stream)
.collect(Collectors.toUnmodifiableMap(triple -> new ByteArray(triple.getB()), Triple::getC));
private static final Map<String, Supplier<ACCT>> supportedAcctsByName = Arrays.stream(SupportedBlockchain.values())
.map(supportedBlockchain -> supportedBlockchain.supportedAccts)
.flatMap(List::stream)
.collect(Collectors.toUnmodifiableMap(Triple::getA, Triple::getC));
private final List<Triple<String, byte[], Supplier<ACCT>>> supportedAccts;
SupportedBlockchain(List<Triple<String, byte[], Supplier<ACCT>>> supportedAccts) {
supportedAccts.forEach(triple -> triple.consume((acctName, hashBytes, supplier) -> {
supportedAcctsByCodeHash.put(new ByteArray(hashBytes), supplier);
supportedAcctsByName.put(acctName, supplier);
}));
this.supportedAccts = supportedAccts;
}
public abstract ForeignBlockchain getInstance();
public abstract ACCT getLatestAcct();
public Map<ByteArray, Supplier<ACCT>> getAcctMap() {
return Collections.unmodifiableMap(this.supportedAcctsByCodeHash);
public static Map<ByteArray, Supplier<ACCT>> getAcctMap() {
return supportedAcctsByCodeHash;
}
public static ACCT getAcctByCodeHash(byte[] codeHash) {
ByteArray wrappedCodeHash = new ByteArray(codeHash);
for (SupportedBlockchain supportedBlockchain : SupportedBlockchain.values()) {
Supplier<ACCT> acctInstanceSupplier = supportedBlockchain.supportedAcctsByCodeHash.get(wrappedCodeHash);
if (acctInstanceSupplier != null)
return acctInstanceSupplier.get();
}
Supplier<ACCT> acctInstanceSupplier = supportedAcctsByCodeHash.get(wrappedCodeHash);
if (acctInstanceSupplier == null)
return null;
return acctInstanceSupplier.get();
}
public static ACCT getAcctByName(String acctName) {
for (SupportedBlockchain supportedBlockchain : SupportedBlockchain.values()) {
Supplier<ACCT> acctInstanceSupplier = supportedBlockchain.supportedAcctsByName.get(acctName);
Supplier<ACCT> acctInstanceSupplier = supportedAcctsByName.get(acctName);
if (acctInstanceSupplier == null)
return null;
if (acctInstanceSupplier != null)
return acctInstanceSupplier.get();
}
return null;
}
}