From 056fc8fbaf9ce05b511b7fe4889bc94ce07e5214 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Fri, 12 Nov 2021 08:59:43 +0000 Subject: [PATCH] Treat a blank identifier as null --- .../qortal/arbitrary/ArbitraryDataReader.java | 5 ++ .../transaction/ArbitraryTransactionData.java | 2 +- .../test/arbitrary/ArbitraryDataTests.java | 49 +++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java index fef870e6..2fc7577b 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java @@ -58,6 +58,11 @@ public class ArbitraryDataReader { resourceId = resourceId.toLowerCase(); } + // If identifier is a blank string, treat it as null + if (identifier == "") { + identifier = null; + } + this.resourceId = resourceId; this.resourceIdType = resourceIdType; this.service = service; diff --git a/src/main/java/org/qortal/data/transaction/ArbitraryTransactionData.java b/src/main/java/org/qortal/data/transaction/ArbitraryTransactionData.java index cfb0f5c5..b2bf0148 100644 --- a/src/main/java/org/qortal/data/transaction/ArbitraryTransactionData.java +++ b/src/main/java/org/qortal/data/transaction/ArbitraryTransactionData.java @@ -182,7 +182,7 @@ public class ArbitraryTransactionData extends TransactionData { } public String getIdentifier() { - return this.identifier; + return (this.identifier != "") ? this.identifier : null; } public Method getMethod() { diff --git a/src/test/java/org/qortal/test/arbitrary/ArbitraryDataTests.java b/src/test/java/org/qortal/test/arbitrary/ArbitraryDataTests.java index 6659000e..bd6a5373 100644 --- a/src/test/java/org/qortal/test/arbitrary/ArbitraryDataTests.java +++ b/src/test/java/org/qortal/test/arbitrary/ArbitraryDataTests.java @@ -276,6 +276,55 @@ public class ArbitraryDataTests extends Common { } } + @Test + public void testBlankIdentifier() throws DataException, IOException, MissingDataException { + try (final Repository repository = RepositoryManager.getRepository()) { + PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); + String publicKey58 = Base58.encode(alice.getPublicKey()); + String name = "TEST"; // Can be anything for this test + String identifier = ""; // Blank, not null + Service service = Service.WEBSITE; // Can be anything for this test + + // Register the name to Alice + RegisterNameTransactionData transactionData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name, ""); + TransactionUtils.signAndMint(repository, transactionData, alice); + + // Create PUT transaction + Path path1 = Paths.get("src/test/resources/arbitrary/demo1"); + ArbitraryDataDigest path1Digest = new ArbitraryDataDigest(path1); + path1Digest.compute(); + this.createAndMintTxn(repository, publicKey58, path1, name, identifier, Method.PUT, service, alice); + + // Now build the latest data state for this name with a null identifier, ensuring that it succeeds and the data matches + ArbitraryDataReader arbitraryDataReader1a = new ArbitraryDataReader(name, ResourceIdType.NAME, service, null); + arbitraryDataReader1a.loadSynchronously(true); + Path initialLayerPath1a = arbitraryDataReader1a.getFilePath(); + ArbitraryDataDigest initialLayerDigest1a = new ArbitraryDataDigest(initialLayerPath1a); + initialLayerDigest1a.compute(); + assertEquals(path1Digest.getHash58(), initialLayerDigest1a.getHash58()); + + // It should also be accessible via a blank string, as we treat null and blank as the same thing + ArbitraryDataReader arbitraryDataReader1b = new ArbitraryDataReader(name, ResourceIdType.NAME, service, ""); + arbitraryDataReader1b.loadSynchronously(true); + Path initialLayerPath1b = arbitraryDataReader1b.getFilePath(); + ArbitraryDataDigest initialLayerDigest1b = new ArbitraryDataDigest(initialLayerPath1b); + initialLayerDigest1b.compute(); + assertEquals(path1Digest.getHash58(), initialLayerDigest1b.getHash58()); + + // Build the latest data state for this name, with a different identifier, ensuring that it fails + String differentIdentifier = "different_identifier"; + ArbitraryDataReader arbitraryDataReader1c = new ArbitraryDataReader(name, ResourceIdType.NAME, service, differentIdentifier); + try { + arbitraryDataReader1c.loadSynchronously(true); + fail("Loading data with incorrect identifier should fail due to nonexistent PUT transaction"); + + } catch (IllegalStateException expectedException) { + assertEquals(String.format("Couldn't find PUT transaction for name %s, service %s " + + "and identifier %s", name.toLowerCase(), service, differentIdentifier), expectedException.getMessage()); + } + } + } + private void createAndMintTxn(Repository repository, String publicKey58, Path path, String name, String identifier, Method method, Service service, PrivateKeyAccount account) throws DataException {