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

View File

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