diff --git a/java/google/registry/tools/GetAllocationTokenCommand.java b/java/google/registry/tools/GetAllocationTokenCommand.java index ab1e507cc..8ef5a4640 100644 --- a/java/google/registry/tools/GetAllocationTokenCommand.java +++ b/java/google/registry/tools/GetAllocationTokenCommand.java @@ -23,8 +23,11 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.googlecode.objectify.Key; +import google.registry.model.domain.DomainBase; import google.registry.model.domain.token.AllocationToken; +import java.util.Collection; import java.util.List; +import java.util.Objects; /** Command to show allocation tokens. */ @Parameters(separators = " =", commandDescription = "Show allocation token(s)") @@ -41,17 +44,49 @@ final class GetAllocationTokenCommand implements CommandWithRemoteApi { public void run() { ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); for (List tokens : Lists.partition(mainParameters, BATCH_SIZE)) { - ImmutableList> keys = + ImmutableList> tokenKeys = tokens.stream().map(t -> Key.create(AllocationToken.class, t)).collect(toImmutableList()); - ofy().load().keys(keys).forEach((k, v) -> builder.put(k.getName(), v)); + ofy().load().keys(tokenKeys).forEach((k, v) -> builder.put(k.getName(), v)); } ImmutableMap loadedTokens = builder.build(); + ImmutableMap, DomainBase> domains = loadRedeemedDomains(loadedTokens.values()); for (String token : mainParameters) { - System.out.println( - loadedTokens.containsKey(token) - ? loadedTokens.get(token) - : String.format("Token %s does not exist.", token)); + if (loadedTokens.containsKey(token)) { + AllocationToken loadedToken = loadedTokens.get(token); + System.out.println(loadedToken.toString()); + if (loadedToken.getRedemptionHistoryEntry() == null) { + System.out.printf("Token %s was not redeemed.\n", token); + } else { + DomainBase domain = + domains.get(loadedToken.getRedemptionHistoryEntry().getParent()); + if (domain == null) { + System.out.printf("ERROR: Token %s was redeemed but domain can't be loaded.\n", token); + } else { + System.out.printf( + "Token %s was redeemed to create domain %s at %s.\n", + token, domain.getFullyQualifiedDomainName(), domain.getCreationTime()); + } + } + } else { + System.out.printf("ERROR: Token %s does not exist.\n", token); + } + System.out.println(); } } + + private static ImmutableMap, DomainBase> loadRedeemedDomains( + Collection tokens) { + ImmutableList> domainKeys = + tokens.stream() + .map(AllocationToken::getRedemptionHistoryEntry) + .filter(Objects::nonNull) + .map(Key::getParent) + .collect(toImmutableList()); + ImmutableMap.Builder, DomainBase> domainsBuilder = new ImmutableMap.Builder<>(); + for (List> keys : Lists.partition(domainKeys, BATCH_SIZE)) { + domainsBuilder.putAll(ofy().load().keys(keys)); + } + return domainsBuilder.build(); + } } diff --git a/javatests/google/registry/tools/GetAllocationTokenCommandTest.java b/javatests/google/registry/tools/GetAllocationTokenCommandTest.java index 8b8fd0906..0343b126d 100644 --- a/javatests/google/registry/tools/GetAllocationTokenCommandTest.java +++ b/javatests/google/registry/tools/GetAllocationTokenCommandTest.java @@ -14,12 +14,17 @@ package google.registry.tools; +import static google.registry.testing.DatastoreHelper.createHistoryEntryForEppResource; +import static google.registry.testing.DatastoreHelper.createTld; +import static google.registry.testing.DatastoreHelper.persistActiveDomain; import static google.registry.testing.DatastoreHelper.persistResource; import static google.registry.testing.DatastoreHelper.persistSimpleResources; import static google.registry.testing.JUnitBackports.assertThrows; import com.beust.jcommander.ParameterException; import com.google.common.collect.ImmutableList; +import com.googlecode.objectify.Key; +import google.registry.model.domain.DomainBase; import google.registry.model.domain.token.AllocationToken; import org.joda.time.DateTime; import org.junit.Test; @@ -33,20 +38,43 @@ public class GetAllocationTokenCommandTest extends CommandTestCase tokens = persistSimpleResources( - ImmutableList.of( - new AllocationToken.Builder() - .setToken("fee") - .setCreationTimeForTest(DateTime.parse("2015-04-07T22:19:17.044Z")) - .build(), - new AllocationToken.Builder().setToken("fii").setDomainName("bar.baz").build())); + ImmutableList tokens = + persistSimpleResources( + ImmutableList.of( + new AllocationToken.Builder() + .setToken("fee") + .setCreationTimeForTest(DateTime.parse("2015-04-07T22:19:17.044Z")) + .build(), + new AllocationToken.Builder().setToken("fii").setDomainName("bar.baz").build())); runCommand("fee", "fii"); - assertInStdout(tokens.get(0).toHydratedString(), tokens.get(1).toHydratedString()); + assertInStdout( + tokens.get(0).toString(), + "Token fee was not redeemed.", + tokens.get(1).toString(), + "Token fii was not redeemed."); + } + + @Test + public void testSuccess_redeemedToken() throws Exception { + createTld("tld"); + DomainBase domain = + persistActiveDomain("fqqdn.tld", DateTime.parse("2016-04-07T22:19:17.044Z")); + AllocationToken token = + persistResource( + new AllocationToken.Builder() + .setToken("foo") + .setDomainName("fqqdn.tld") + .setRedemptionHistoryEntry(Key.create(createHistoryEntryForEppResource(domain))) + .build()); + runCommand("foo"); + assertInStdout( + token.toString(), + "Token foo was redeemed to create domain fqqdn.tld at 2016-04-07T22:19:17.044Z."); } @Test @@ -55,7 +83,10 @@ public class GetAllocationTokenCommandTest extends CommandTestCase