diff --git a/java/google/registry/config/RegistryConfig.java b/java/google/registry/config/RegistryConfig.java
index ce8b9d6de..1b3ed6dc0 100644
--- a/java/google/registry/config/RegistryConfig.java
+++ b/java/google/registry/config/RegistryConfig.java
@@ -15,6 +15,7 @@
package google.registry.config;
import static google.registry.config.ConfigUtils.makeUrl;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static org.joda.time.Duration.standardDays;
import com.google.appengine.api.utils.SystemProperty;
@@ -26,9 +27,11 @@ import com.google.common.net.HostAndPort;
import dagger.Module;
import dagger.Provides;
import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
import java.net.URI;
import java.net.URL;
import javax.annotation.Nullable;
+import javax.inject.Named;
import javax.inject.Qualifier;
import javax.inject.Singleton;
import org.joda.money.CurrencyUnit;
@@ -42,6 +45,7 @@ public final class RegistryConfig {
/** Dagger qualifier for configuration settings. */
@Qualifier
+ @Retention(RUNTIME)
@Documented
public static @interface Config {
String value() default "";
@@ -474,7 +478,7 @@ public final class RegistryConfig {
/**
* The email address that outgoing emails from the app are sent from.
*
- * @see google.registry.util.SendEmailUtils
+ * @see google.registry.ui.server.registrar.SendEmailUtils
*/
@Provides
@Config("googleAppsSendFromEmailAddress")
@@ -485,7 +489,7 @@ public final class RegistryConfig {
/**
* The display name that is used on outgoing emails sent by Nomulus.
*
- * @see google.registry.util.SendEmailUtils
+ * @see google.registry.ui.server.registrar.SendEmailUtils
*/
@Provides
@Config("googleAppsAdminEmailDisplayName")
@@ -724,10 +728,13 @@ public final class RegistryConfig {
*
*
The number of milliseconds it'll sleep before giving up is {@code 2^n - 2}.
*
+ *
Note that this uses {@code @Named} instead of {@code @Config} so that it can be used from
+ * the low-level util package, which cannot have a dependency on the config package.
+ *
* @see google.registry.util.TaskEnqueuer
*/
@Provides
- @Config("transientFailureRetries")
+ @Named("transientFailureRetries")
public static int provideTransientFailureRetries() {
return 12; // Four seconds.
}
diff --git a/java/google/registry/dns/writer/clouddns/CloudDnsWriter.java b/java/google/registry/dns/writer/clouddns/CloudDnsWriter.java
index 73b6644f1..4e81a393b 100644
--- a/java/google/registry/dns/writer/clouddns/CloudDnsWriter.java
+++ b/java/google/registry/dns/writer/clouddns/CloudDnsWriter.java
@@ -72,7 +72,7 @@ public class CloudDnsWriter implements DnsWriter {
private final Clock clock;
private final RateLimiter rateLimiter;
- // TODO(shikhman): This uses @Config("transientFailureRetries") which may not be tuned for this
+ // TODO(shikhman): This uses @Named("transientFailureRetries") which may not be tuned for this
// application.
private final Retrier retrier;
private final Duration defaultTtl;
diff --git a/java/google/registry/util/CacheUtils.java b/java/google/registry/model/CacheUtils.java
similarity index 59%
rename from java/google/registry/util/CacheUtils.java
rename to java/google/registry/model/CacheUtils.java
index 645607ff7..f00b9f64f 100644
--- a/java/google/registry/util/CacheUtils.java
+++ b/java/google/registry/model/CacheUtils.java
@@ -12,10 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package google.registry.util;
+package google.registry.model;
import static com.google.common.base.Suppliers.memoizeWithExpiration;
-import static google.registry.config.RegistryConfig.getSingletonCachePersistDuration;
import static google.registry.config.RegistryConfig.getSingletonCacheRefreshDuration;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static org.joda.time.Duration.ZERO;
@@ -23,7 +22,7 @@ import static org.joda.time.Duration.ZERO;
import com.google.common.base.Supplier;
import org.joda.time.Duration;
-/** Utility methods related to caching. */
+/** Utility methods related to caching Datastore entities. */
public class CacheUtils {
/**
@@ -33,25 +32,9 @@ public class CacheUtils {
* lists downloaded from the TMCH get updated in datastore and the caches need to be refreshed.)
*/
public static Supplier memoizeWithShortExpiration(Supplier original) {
- return memoizeForDuration(original, getSingletonCacheRefreshDuration());
- }
-
- /**
- * Memoize a supplier, with a long expiration specified in the environment config.
- *
- * Use this for things that are loaded lazily but then will never change. This allows the test
- * config to set the expiration time to zero so that different test values can be substituted in,
- * while allowing the production config to set the expiration to forever.
- */
- public static Supplier memoizeWithLongExpiration(Supplier original) {
- return memoizeForDuration(original, getSingletonCachePersistDuration());
- }
-
- /** Memoize a supplier, with a given expiration. */
- private static Supplier memoizeForDuration(Supplier original, Duration expiration) {
+ Duration expiration = getSingletonCacheRefreshDuration();
return expiration.isEqual(ZERO)
- ? original // memoizeWithExpiration won't accept 0 as a refresh duration.
+ ? original
: memoizeWithExpiration(original, expiration.getMillis(), MILLISECONDS);
}
}
-
diff --git a/java/google/registry/model/RoidSuffixes.java b/java/google/registry/model/RoidSuffixes.java
index c567acfc4..2b19d9872 100644
--- a/java/google/registry/model/RoidSuffixes.java
+++ b/java/google/registry/model/RoidSuffixes.java
@@ -15,9 +15,9 @@
package google.registry.model;
import static com.google.common.base.Preconditions.checkState;
+import static google.registry.model.CacheUtils.memoizeWithShortExpiration;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import static google.registry.model.ofy.ObjectifyService.ofy;
-import static google.registry.util.CacheUtils.memoizeWithShortExpiration;
import com.google.common.base.Supplier;
import com.google.common.collect.HashBiMap;
diff --git a/java/google/registry/model/billing/RegistrarBillingUtils.java b/java/google/registry/model/billing/RegistrarBillingUtils.java
index e82fa7797..20cb75e0b 100644
--- a/java/google/registry/model/billing/RegistrarBillingUtils.java
+++ b/java/google/registry/model/billing/RegistrarBillingUtils.java
@@ -25,10 +25,10 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Maps.EntryTransformer;
import com.google.common.collect.Ordering;
import com.googlecode.objectify.cmd.Query;
+import google.registry.model.CacheUtils;
import google.registry.model.registrar.Registrar;
import google.registry.model.registry.Registries;
import google.registry.model.registry.Registry;
-import google.registry.util.CacheUtils;
import java.util.Map;
import org.joda.money.CurrencyUnit;
import org.joda.money.Money;
diff --git a/java/google/registry/model/registry/Registries.java b/java/google/registry/model/registry/Registries.java
index ec2e2e8ea..31619b115 100644
--- a/java/google/registry/model/registry/Registries.java
+++ b/java/google/registry/model/registry/Registries.java
@@ -19,9 +19,9 @@ import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Predicates.equalTo;
import static com.google.common.base.Strings.emptyToNull;
import static com.google.common.collect.Maps.filterValues;
+import static google.registry.model.CacheUtils.memoizeWithShortExpiration;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import static google.registry.model.ofy.ObjectifyService.ofy;
-import static google.registry.util.CacheUtils.memoizeWithShortExpiration;
import static google.registry.util.PreconditionsUtils.checkArgumentNotNull;
import com.google.common.base.Optional;
diff --git a/java/google/registry/model/smd/SignedMarkRevocationList.java b/java/google/registry/model/smd/SignedMarkRevocationList.java
index 19a38abcb..d5a3fa8c3 100644
--- a/java/google/registry/model/smd/SignedMarkRevocationList.java
+++ b/java/google/registry/model/smd/SignedMarkRevocationList.java
@@ -17,10 +17,10 @@ package google.registry.model.smd;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.collect.Iterables.isEmpty;
+import static google.registry.model.CacheUtils.memoizeWithShortExpiration;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import static google.registry.model.ofy.ObjectifyService.allocateId;
import static google.registry.model.ofy.ObjectifyService.ofy;
-import static google.registry.util.CacheUtils.memoizeWithShortExpiration;
import static google.registry.util.DateTimeUtils.START_OF_TIME;
import static google.registry.util.DateTimeUtils.isBeforeOrAt;
diff --git a/java/google/registry/model/tmch/ClaimsListShard.java b/java/google/registry/model/tmch/ClaimsListShard.java
index d07c0ca35..4775f5ba5 100644
--- a/java/google/registry/model/tmch/ClaimsListShard.java
+++ b/java/google/registry/model/tmch/ClaimsListShard.java
@@ -17,10 +17,10 @@ package google.registry.model.tmch;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Verify.verify;
+import static google.registry.model.CacheUtils.memoizeWithShortExpiration;
import static google.registry.model.ofy.ObjectifyService.allocateId;
import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.ofy.Ofy.RECOMMENDED_MEMCACHE_EXPIRATION;
-import static google.registry.util.CacheUtils.memoizeWithShortExpiration;
import static google.registry.util.DateTimeUtils.START_OF_TIME;
import com.google.common.annotations.VisibleForTesting;
diff --git a/java/google/registry/ui/server/registrar/RegistrarSettingsAction.java b/java/google/registry/ui/server/registrar/RegistrarSettingsAction.java
index 2bf07705e..6abb87166 100644
--- a/java/google/registry/ui/server/registrar/RegistrarSettingsAction.java
+++ b/java/google/registry/ui/server/registrar/RegistrarSettingsAction.java
@@ -45,7 +45,6 @@ import google.registry.ui.server.RegistrarFormFields;
import google.registry.util.CidrAddressBlock;
import google.registry.util.CollectionUtils;
import google.registry.util.DiffUtils;
-import google.registry.util.SendEmailUtils;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
diff --git a/java/google/registry/util/SendEmailUtils.java b/java/google/registry/ui/server/registrar/SendEmailUtils.java
similarity index 94%
rename from java/google/registry/util/SendEmailUtils.java
rename to java/google/registry/ui/server/registrar/SendEmailUtils.java
index 9cbb57fb3..47977606c 100644
--- a/java/google/registry/util/SendEmailUtils.java
+++ b/java/google/registry/ui/server/registrar/SendEmailUtils.java
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package google.registry.util;
+package google.registry.ui.server.registrar;
import static com.google.common.collect.Iterables.toArray;
@@ -21,6 +21,9 @@ import com.google.common.base.Joiner;
import com.google.common.base.Predicates;
import com.google.common.collect.FluentIterable;
import google.registry.config.RegistryConfig.Config;
+import google.registry.util.FormattingLogger;
+import google.registry.util.NonFinalForTesting;
+import google.registry.util.SendEmailService;
import java.util.List;
import javax.inject.Inject;
import javax.mail.Message;
diff --git a/java/google/registry/util/BUILD b/java/google/registry/util/BUILD
index 70264257a..f625b86b5 100644
--- a/java/google/registry/util/BUILD
+++ b/java/google/registry/util/BUILD
@@ -8,7 +8,6 @@ java_library(
name = "util",
srcs = glob(["*.java"]),
deps = [
- "//java/google/registry/config",
"//third_party/java/objectify:objectify-v4_1",
"@com_google_appengine_api_1_0_sdk",
"@com_google_code_findbugs_jsr305",
diff --git a/java/google/registry/util/Retrier.java b/java/google/registry/util/Retrier.java
index 0f29bbc14..98a4d7086 100644
--- a/java/google/registry/util/Retrier.java
+++ b/java/google/registry/util/Retrier.java
@@ -21,11 +21,11 @@ import static google.registry.util.PredicateUtils.supertypeOf;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableSet;
-import google.registry.config.RegistryConfig.Config;
import java.io.Serializable;
import java.util.Set;
import java.util.concurrent.Callable;
import javax.inject.Inject;
+import javax.inject.Named;
import org.joda.time.Duration;
/** Wrapper that does retry with exponential backoff. */
@@ -39,7 +39,7 @@ public class Retrier implements Serializable {
private final int attempts;
@Inject
- public Retrier(Sleeper sleeper, @Config("transientFailureRetries") int transientFailureRetries) {
+ public Retrier(Sleeper sleeper, @Named("transientFailureRetries") int transientFailureRetries) {
this.sleeper = sleeper;
checkArgument(transientFailureRetries > 0, "Number of attempts must be positive");
this.attempts = transientFailureRetries;
diff --git a/java/google/registry/whois/RegistrarLookupCommand.java b/java/google/registry/whois/RegistrarLookupCommand.java
index 53c8ed804..0636ca275 100644
--- a/java/google/registry/whois/RegistrarLookupCommand.java
+++ b/java/google/registry/whois/RegistrarLookupCommand.java
@@ -16,7 +16,7 @@ package google.registry.whois;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Strings.isNullOrEmpty;
-import static google.registry.util.CacheUtils.memoizeWithShortExpiration;
+import static google.registry.model.CacheUtils.memoizeWithShortExpiration;
import static google.registry.util.RegistrarUtils.normalizeRegistrarName;
import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
diff --git a/javatests/google/registry/ui/server/registrar/RegistrarSettingsActionTestCase.java b/javatests/google/registry/ui/server/registrar/RegistrarSettingsActionTestCase.java
index 14100f458..d219c2cb2 100644
--- a/javatests/google/registry/ui/server/registrar/RegistrarSettingsActionTestCase.java
+++ b/javatests/google/registry/ui/server/registrar/RegistrarSettingsActionTestCase.java
@@ -37,7 +37,6 @@ import google.registry.testing.AppEngineRule;
import google.registry.testing.FakeClock;
import google.registry.testing.InjectRule;
import google.registry.util.SendEmailService;
-import google.registry.util.SendEmailUtils;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Map;
diff --git a/javatests/google/registry/util/SendEmailUtilsTest.java b/javatests/google/registry/ui/server/registrar/SendEmailUtilsTest.java
similarity index 98%
rename from javatests/google/registry/util/SendEmailUtilsTest.java
rename to javatests/google/registry/ui/server/registrar/SendEmailUtilsTest.java
index 3d500c061..fc3a21719 100644
--- a/javatests/google/registry/util/SendEmailUtilsTest.java
+++ b/javatests/google/registry/ui/server/registrar/SendEmailUtilsTest.java
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package google.registry.util;
+package google.registry.ui.server.registrar;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
@@ -25,6 +25,7 @@ import com.google.common.collect.ImmutableList;
import google.registry.config.RegistryConfig.LocalTestConfig;
import google.registry.testing.ExceptionRule;
import google.registry.testing.InjectRule;
+import google.registry.util.SendEmailService;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Message.RecipientType;