diff --git a/src/main/java/org/qortal/api/resource/ArbitraryResource.java b/src/main/java/org/qortal/api/resource/ArbitraryResource.java index 6502e9a7..36a61993 100644 --- a/src/main/java/org/qortal/api/resource/ArbitraryResource.java +++ b/src/main/java/org/qortal/api/resource/ArbitraryResource.java @@ -356,12 +356,14 @@ public class ArbitraryResource { } ) @ApiErrors({ApiError.REPOSITORY_ISSUE}) - public List getHostedTransactions(@HeaderParam(Security.API_KEY_HEADER) String apiKey) { + public List getHostedTransactions(@HeaderParam(Security.API_KEY_HEADER) String apiKey, + @Parameter(ref = "limit") @QueryParam("limit") Integer limit, + @Parameter(ref = "offset") @QueryParam("offset") Integer offset) { Security.checkApiCallAllowed(request); try (final Repository repository = RepositoryManager.getRepository()) { - List hostedTransactions = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository); + List hostedTransactions = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, limit, offset); return hostedTransactions; @@ -383,14 +385,16 @@ public class ArbitraryResource { @ApiErrors({ApiError.REPOSITORY_ISSUE}) public List getHostedResources( @HeaderParam(Security.API_KEY_HEADER) String apiKey, - @Parameter(description = "Include status") @QueryParam("includestatus") Boolean includeStatus) { + @Parameter(description = "Include status") @QueryParam("includestatus") Boolean includeStatus, + @Parameter(ref = "limit") @QueryParam("limit") Integer limit, + @Parameter(ref = "offset") @QueryParam("offset") Integer offset) { Security.checkApiCallAllowed(request); List resources = new ArrayList<>(); try (final Repository repository = RepositoryManager.getRepository()) { - List transactionDataList = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository); + List transactionDataList = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, limit, offset); for (ArbitraryTransactionData transactionData : transactionDataList) { ArbitraryResourceInfo arbitraryResourceInfo = new ArbitraryResourceInfo(); arbitraryResourceInfo.name = transactionData.getName(); diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java index 3afba772..7fdd907a 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java @@ -367,7 +367,7 @@ public class ArbitraryDataManager extends Thread { public void broadcastHostedSignatureList() { try (final Repository repository = RepositoryManager.getRepository()) { - List hostedTransactions = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository); + List hostedTransactions = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, null, null); List hostedSignatures = hostedTransactions.stream().map(ArbitraryTransactionData::getSignature).collect(Collectors.toList()); if (!hostedSignatures.isEmpty()) { // Broadcast the list, using null to represent our peer address diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java index c95b0694..1bbe3523 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java @@ -10,6 +10,7 @@ import org.qortal.repository.DataException; import org.qortal.repository.Repository; import org.qortal.settings.Settings; import org.qortal.transaction.Transaction; +import org.qortal.utils.ArbitraryTransactionUtils; import org.qortal.utils.Base58; import org.qortal.utils.FilesystemUtils; import org.qortal.utils.NTP; @@ -19,6 +20,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -257,10 +259,10 @@ public class ArbitraryDataStorageManager extends Thread { // Hosted data - public List listAllHostedTransactions(Repository repository) { + public List listAllHostedTransactions(Repository repository, Integer limit, Integer offset) { // Load from cache if we can, to avoid disk reads if (this.hostedTransactions != null) { - return this.hostedTransactions; + return ArbitraryTransactionUtils.limitOffsetTransactions(this.hostedTransactions, limit, offset); } List arbitraryTransactionDataList = new ArrayList<>(); @@ -293,7 +295,7 @@ public class ArbitraryDataStorageManager extends Thread { // Update cache this.hostedTransactions = arbitraryTransactionDataList; - return arbitraryTransactionDataList; + return ArbitraryTransactionUtils.limitOffsetTransactions(arbitraryTransactionDataList, limit, offset); } /** @@ -446,7 +448,7 @@ public class ArbitraryDataStorageManager extends Thread { long maxStoragePerName = this.storageCapacityPerName(threshold); // Fetch all hosted transactions - List hostedTransactions = this.listAllHostedTransactions(repository); + List hostedTransactions = this.listAllHostedTransactions(repository, null, null); for (ArbitraryTransactionData transactionData : hostedTransactions) { String transactionName = transactionData.getName(); if (!Objects.equals(name, transactionName)) { diff --git a/src/main/java/org/qortal/utils/ArbitraryTransactionUtils.java b/src/main/java/org/qortal/utils/ArbitraryTransactionUtils.java index 51c2b2d3..3221c87b 100644 --- a/src/main/java/org/qortal/utils/ArbitraryTransactionUtils.java +++ b/src/main/java/org/qortal/utils/ArbitraryTransactionUtils.java @@ -17,7 +17,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; @@ -352,4 +355,25 @@ public class ArbitraryTransactionUtils { return filesRelocatedCount; } + public static List limitOffsetTransactions(List transactions, + Integer limit, Integer offset) { + if (limit != null && limit == 0) { + limit = null; + } + if (limit == null && offset == null) { + return transactions; + } + if (offset == null) { + offset = 0; + } + if (offset > transactions.size() - 1) { + return new ArrayList<>(); + } + + if (limit == null) { + return transactions.stream().skip(offset).collect(Collectors.toList()); + } + return transactions.stream().skip(offset).limit(limit).collect(Collectors.toList()); + } + }