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);