diff --git a/core/src/main/java/google/registry/persistence/VKey.java b/core/src/main/java/google/registry/persistence/VKey.java index 41fa7d8ee..669743ed0 100644 --- a/core/src/main/java/google/registry/persistence/VKey.java +++ b/core/src/main/java/google/registry/persistence/VKey.java @@ -311,4 +311,29 @@ public class VKey extends ImmutableObject implements Serializable { } return key; } + + /** + * Constructs the readable string representation of a {@link VKey}. + * + *

This readable string representation of a vkey contains its type and its sql key or ofy key, + * or both. + */ + @Override + public String toString() { + if (maybeGetOfyKey().isPresent() && maybeGetSqlKey().isPresent()) { + return String.format( + "VKey<%s>(%s:%s,%s:%s)", + getKind().getSimpleName(), SQL_LOOKUP_KEY, sqlKey, OFY_LOOKUP_KEY, ofyKeyToString()); + } else if (maybeGetSqlKey().isPresent()) { + return String.format("VKey<%s>(%s:%s)", getKind().getSimpleName(), SQL_LOOKUP_KEY, sqlKey); + } else if (maybeGetOfyKey().isPresent()) { + return String.format("VKey<%s>(%s:%s)", ofyKey.getKind(), OFY_LOOKUP_KEY, ofyKeyToString()); + } else { + throw new IllegalStateException("VKey should contain at least one form of key"); + } + } + + private String ofyKeyToString() { + return ofyKey.getName() == null ? String.valueOf(ofyKey.getId()) : ofyKey.getName(); + } } diff --git a/core/src/main/java/google/registry/tools/GetResourceByKeyCommand.java b/core/src/main/java/google/registry/tools/GetResourceByKeyCommand.java index 18ddf88d9..df729c6c7 100644 --- a/core/src/main/java/google/registry/tools/GetResourceByKeyCommand.java +++ b/core/src/main/java/google/registry/tools/GetResourceByKeyCommand.java @@ -48,7 +48,7 @@ final class GetResourceByKeyCommand implements CommandWithRemoteApi { EppResource resource = checkNotNull( auditedOfy().load().key(resourceKey.getOfyKey()).now(), - "Could not load resource for key: " + resourceKey.getOfyKey()); + "Could not load resource for key: " + resourceKey); System.out.println(expand ? resource.toHydratedString() : resource.toString()); } } diff --git a/core/src/test/java/google/registry/persistence/VKeyTest.java b/core/src/test/java/google/registry/persistence/VKeyTest.java index dc3aedbd5..1209975e5 100644 --- a/core/src/test/java/google/registry/persistence/VKeyTest.java +++ b/core/src/test/java/google/registry/persistence/VKeyTest.java @@ -418,6 +418,32 @@ class VKeyTest { assertThat(VKey.create(vkeyStringFromQueue)).isEqualTo(vkey); } + @Test + void testToString_sqlOnlyVKey() { + assertThat(VKey.createSql(TestObject.class, "testId").toString()) + .isEqualTo("VKey(sql:testId)"); + } + + @Test + void testToString_ofyOnlyVKey_withName() { + assertThat( + VKey.createOfy(TestObject.class, Key.create(TestObject.class, "testName")).toString()) + .isEqualTo("VKey(ofy:testName)"); + } + + @Test + void testToString_ofyOnlyVKey_withId() { + assertThat(VKey.createOfy(TestObject.class, Key.create(TestObject.class, 12345)).toString()) + .isEqualTo("VKey(ofy:12345)"); + } + + @Test + void testToString_sqlAndOfyVKey() { + assertThat( + VKey.create(TestObject.class, "foo", Key.create(TestObject.create("ofy"))).toString()) + .isEqualTo("VKey(sql:foo,ofy:ofy)"); + } + @Entity static class OtherObject {} } diff --git a/core/src/test/java/google/registry/tools/GetResourceByKeyCommandTest.java b/core/src/test/java/google/registry/tools/GetResourceByKeyCommandTest.java index a4c84ce15..fa0ac93ac 100644 --- a/core/src/test/java/google/registry/tools/GetResourceByKeyCommandTest.java +++ b/core/src/test/java/google/registry/tools/GetResourceByKeyCommandTest.java @@ -79,7 +79,7 @@ class GetResourceByKeyCommandTest extends CommandTestCase(DomainBase(\"4-TLD\"))"); + .contains("Could not load resource for key: VKey(sql:4-TLD,ofy:4-TLD)"); } @Test @@ -128,7 +128,7 @@ class GetResourceByKeyCommandTest extends CommandTestCase(ContactResource(\"3-ROID\"))"); + .contains("Could not load resource for key: VKey(sql:3-ROID,ofy:3-ROID)"); } @Test @@ -177,7 +177,7 @@ class GetResourceByKeyCommandTest extends CommandTestCase(HostResource(\"3-ROID\"))"); + .contains("Could not load resource for key: VKey(sql:3-ROID,ofy:3-ROID)"); } @Test @@ -210,7 +210,7 @@ class GetResourceByKeyCommandTest extends CommandTestCase runCommand("agR0ZXN0chULEgpEb21haW5CYXNlIgUyLVRMRAw")); assertThat(thrown) .hasMessageThat() - .contains("Could not load resource for key: Key(DomainBase(\"2-TLD\"))"); + .contains("Could not load resource for key: VKey(sql:2-TLD,ofy:2-TLD)"); } @Test diff --git a/core/src/test/java/google/registry/tools/SetupOteCommandTest.java b/core/src/test/java/google/registry/tools/SetupOteCommandTest.java index be5e6caac..f1b7ab88d 100644 --- a/core/src/test/java/google/registry/tools/SetupOteCommandTest.java +++ b/core/src/test/java/google/registry/tools/SetupOteCommandTest.java @@ -331,7 +331,9 @@ class SetupOteCommandTest extends CommandTestCase { "--registrar=blobio", "--email=contact@email.com", "--certfile=" + getCertFilename())); - assertThat(thrown).hasMessageThat().contains("Registry(\"blobio-sunrise\")"); + assertThat(thrown) + .hasMessageThat() + .contains("VKey(sql:blobio-sunrise,ofy:blobio-sunrise)"); } @Test @@ -367,7 +369,7 @@ class SetupOteCommandTest extends CommandTestCase { "--registrar=blobio", "--email=contact@email.com", "--certfile=" + getCertFilename())); - assertThat(thrown).hasMessageThat().contains("Registrar(\"blobio-1\")"); + assertThat(thrown).hasMessageThat().contains("VKey(sql:blobio-1,ofy:blobio-1)"); } @Test