diff --git a/java/google/registry/rde/RdeContactImportAction.java b/java/google/registry/rde/RdeContactImportAction.java index 6e4cd6258..220598b6b 100644 --- a/java/google/registry/rde/RdeContactImportAction.java +++ b/java/google/registry/rde/RdeContactImportAction.java @@ -23,7 +23,6 @@ import com.google.appengine.tools.cloudstorage.GcsService; import com.google.appengine.tools.cloudstorage.GcsServiceFactory; import com.google.appengine.tools.cloudstorage.RetryParams; import com.google.appengine.tools.mapreduce.Mapper; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import google.registry.config.ConfigModule; @@ -80,21 +79,15 @@ public class RdeContactImportAction implements Runnable { /** * Creates a new {@link RdeContactInput} - * - *

Should be overridden in a subclass for the purposes of unit testing. */ - @VisibleForTesting - RdeContactInput createInput() { + private RdeContactInput createInput() { return new RdeContactInput(mapShards, importBucketName, importFileName); } /** * Creates a new {@link RdeContactImportMapper} - * - *

Should be overridden in a subclass for the purposes of unit testing. */ - @VisibleForTesting - RdeContactImportMapper createMapper() { + private RdeContactImportMapper createMapper() { return new RdeContactImportMapper(importBucketName); } diff --git a/java/google/registry/rde/RdeContactInput.java b/java/google/registry/rde/RdeContactInput.java index 1991202e3..53f3c84d9 100644 --- a/java/google/registry/rde/RdeContactInput.java +++ b/java/google/registry/rde/RdeContactInput.java @@ -101,10 +101,8 @@ public class RdeContactInput extends Input { /** * Creates a new instance of {@link RdeContactReader} - * - *

This method can be overridden by a subclass for the purposes of unit testing. */ - protected RdeContactReader newReader(int offset, int maxResults) { + private RdeContactReader newReader(int offset, int maxResults) { return new RdeContactReader(importBucketName, importFileName, offset, maxResults); } diff --git a/java/google/registry/rde/RdeImportUtils.java b/java/google/registry/rde/RdeImportUtils.java index a55f0e43c..5334f1240 100644 --- a/java/google/registry/rde/RdeImportUtils.java +++ b/java/google/registry/rde/RdeImportUtils.java @@ -22,6 +22,7 @@ import com.googlecode.objectify.Key; import com.googlecode.objectify.Work; import google.registry.config.ConfigModule.Config; import google.registry.gcs.GcsUtils; +import google.registry.model.EppResource; import google.registry.model.contact.ContactResource; import google.registry.model.index.EppResourceIndex; import google.registry.model.index.ForeignKeyIndex; @@ -60,6 +61,44 @@ public class RdeImportUtils { this.escrowBucketName = escrowBucketName; } + private boolean importEppResource(final T resource, final String type) { + @SuppressWarnings("unchecked") + final Class resourceClass = (Class) resource.getClass(); + return ofy.transact( + new Work() { + @Override + public Boolean run() { + EppResource existing = ofy.load().key(Key.create(resource)).now(); + if (existing == null) { + ForeignKeyIndex existingForeignKeyIndex = + ForeignKeyIndex.load( + resourceClass, resource.getForeignKey(), clock.nowUtc()); + // foreign key index should not exist, since existing resource was not found. + checkState( + existingForeignKeyIndex == null, + "New %s resource has existing foreign key index; foreignKey=%s, repoId=%s", + type, + resource.getForeignKey(), + resource.getRepoId()); + ofy.save().entity(resource); + ofy.save().entity(ForeignKeyIndex.create(resource, resource.getDeletionTime())); + ofy.save().entity(EppResourceIndex.create(Key.create(resource))); + logger.infofmt( + "Imported %s resource - ROID=%s, id=%s", + type, resource.getRepoId(), resource.getForeignKey()); + return true; + } else if (!existing.getRepoId().equals(resource.getRepoId())) { + logger.warningfmt( + "Existing %s with same id but different ROID. " + + "id=%s, existing ROID=%s, new ROID=%s", + type, resource.getForeignKey(), existing.getRepoId(), resource.getRepoId()); + } + return false; + } + }); + } + + /** /** * Imports a contact from an escrow file. * @@ -71,38 +110,7 @@ public class RdeImportUtils { * @return true if the contact was created or updated, false otherwise. */ public boolean importContact(final ContactResource resource) { - return ofy.transact( - new Work() { - @Override - public Boolean run() { - ContactResource existing = ofy.load().key(Key.create(resource)).now(); - if (existing == null) { - ForeignKeyIndex existingForeignKeyIndex = - ForeignKeyIndex.load( - ContactResource.class, resource.getContactId(), clock.nowUtc()); - // foreign key index should not exist, since existing contact was not found. - checkState( - existingForeignKeyIndex == null, - String.format( - "New contact resource has existing foreign key index. " - + "contactId=%s, repoId=%s", - resource.getContactId(), resource.getRepoId())); - ofy.save().entity(resource); - ofy.save().entity(ForeignKeyIndex.create(resource, resource.getDeletionTime())); - ofy.save().entity(EppResourceIndex.create(Key.create(resource))); - logger.infofmt( - "Imported contact resource - ROID=%s, id=%s", - resource.getRepoId(), resource.getContactId()); - return true; - } else if (!existing.getRepoId().equals(resource.getRepoId())) { - logger.warningfmt( - "Existing contact with same contact id but different ROID. " - + "contactId=%s, existing ROID=%s, new ROID=%s", - resource.getContactId(), existing.getRepoId(), resource.getRepoId()); - } - return false; - } - }); + return importEppResource(resource, "contact"); } /** diff --git a/java/google/registry/util/XmlToEnumMapper.java b/java/google/registry/util/XmlToEnumMapper.java index cd7f11490..e30d45b2a 100644 --- a/java/google/registry/util/XmlToEnumMapper.java +++ b/java/google/registry/util/XmlToEnumMapper.java @@ -14,6 +14,8 @@ package google.registry.util; +import static google.registry.util.PreconditionsUtils.checkArgumentNotNull; + import com.google.common.collect.ImmutableMap; import javax.xml.bind.annotation.XmlEnumValue; @@ -38,12 +40,12 @@ public final class XmlToEnumMapper> { ImmutableMap.Builder mapBuilder = new ImmutableMap.Builder<>(); for (T value : enumValues) { try { - String xmlName = - value - .getDeclaringClass() - .getField(value.name()) - .getAnnotation(XmlEnumValue.class) - .value(); + XmlEnumValue xmlAnnotation = value + .getDeclaringClass() + .getField(value.name()) + .getAnnotation(XmlEnumValue.class); + checkArgumentNotNull(xmlAnnotation, "Cannot map enum value to xml name: " + value); + String xmlName = xmlAnnotation.value(); mapBuilder = mapBuilder.put(xmlName, value); } catch (NoSuchFieldException e) { throw new RuntimeException(e);