diff --git a/java/google/registry/whois/BUILD b/java/google/registry/whois/BUILD index 10f1475a5..8aabcb716 100644 --- a/java/google/registry/whois/BUILD +++ b/java/google/registry/whois/BUILD @@ -16,6 +16,7 @@ java_library( "//java/google/registry/xml", "//third_party/java/objectify:objectify-v4_1", "@com_google_appengine_api_1_0_sdk", + "@com_google_auto_factory", "@com_google_auto_value", "@com_google_code_findbugs_jsr305", "@com_google_dagger", diff --git a/java/google/registry/whois/Whois.java b/java/google/registry/whois/Whois.java index bcbe66f5d..63c66e0b4 100644 --- a/java/google/registry/whois/Whois.java +++ b/java/google/registry/whois/Whois.java @@ -26,24 +26,25 @@ public final class Whois { private final Clock clock; private final String disclaimer; - private final WhoisCommandFactory commandFactory; + private final WhoisReaderFactory whoisReaderFactory; @Inject public Whois( Clock clock, @Config("whoisDisclaimer") String disclaimer, - @Config("whoisCommandFactory") WhoisCommandFactory commandFactory) { + WhoisReaderFactory whoisReader) { this.clock = clock; this.disclaimer = disclaimer; - this.commandFactory = commandFactory; + this.whoisReaderFactory = whoisReader; } /** Performs a WHOIS lookup on a plaintext query string. */ public String lookup(String query, boolean preferUnicode) { DateTime now = clock.nowUtc(); try { - return new WhoisReader(new StringReader(query), commandFactory, now) - .readCommand() + return whoisReaderFactory + .create(now) + .readCommand(new StringReader(query)) .executeQuery(now) .getPlainTextOutput(preferUnicode, disclaimer); } catch (WhoisException e) { diff --git a/java/google/registry/whois/WhoisHttpServer.java b/java/google/registry/whois/WhoisHttpServer.java index 86528788c..ea7cdb50b 100644 --- a/java/google/registry/whois/WhoisHttpServer.java +++ b/java/google/registry/whois/WhoisHttpServer.java @@ -34,7 +34,6 @@ import google.registry.request.Response; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import java.io.IOException; -import java.io.Reader; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; @@ -132,7 +131,7 @@ public final class WhoisHttpServer implements Runnable { @Inject Response response; @Inject @Config("whoisDisclaimer") String disclaimer; @Inject @Config("whoisHttpExpires") Duration expires; - @Inject @Config("whoisCommandFactory") WhoisCommandFactory commandFactory; + @Inject WhoisReaderFactory whoisReaderFactory; @Inject @RequestPath String requestPath; @Inject WhoisHttpServer() {} @@ -143,10 +142,10 @@ public final class WhoisHttpServer implements Runnable { try { // Extremely permissive parsing that turns stuff like "/hello/world/" into "hello world". String command = decode(JOINER.join(SLASHER.split(path.substring(PATH.length())))) + "\r\n"; - Reader reader = new StringReader(command); DateTime now = clock.nowUtc(); sendResponse( - SC_OK, new WhoisReader(reader, commandFactory, now).readCommand().executeQuery(now)); + SC_OK, + whoisReaderFactory.create(now).readCommand(new StringReader(command)).executeQuery(now)); } catch (WhoisException e) { sendResponse(e.getStatus(), e); } catch (IOException e) { diff --git a/java/google/registry/whois/WhoisReader.java b/java/google/registry/whois/WhoisReader.java index 401e1fcda..f111d7d01 100644 --- a/java/google/registry/whois/WhoisReader.java +++ b/java/google/registry/whois/WhoisReader.java @@ -20,15 +20,19 @@ import static google.registry.model.registry.Registries.findTldForName; import static google.registry.util.DomainNameUtils.canonicalizeDomainName; import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; +import com.google.auto.factory.AutoFactory; +import com.google.auto.factory.Provided; import com.google.common.base.Joiner; import com.google.common.base.Optional; import com.google.common.io.CharStreams; import com.google.common.net.InetAddresses; import com.google.common.net.InternetDomainName; +import google.registry.config.RegistryConfig.Config; import java.io.IOException; import java.io.Reader; import java.util.ArrayList; import java.util.List; +import javax.inject.Inject; import org.joda.time.DateTime; /** @@ -58,6 +62,7 @@ import org.joda.time.DateTime; * @see RFC 3912 * @see IANA Registrar IDs */ +@AutoFactory class WhoisReader { /** @@ -68,15 +73,15 @@ class WhoisReader { static final String NAMESERVER_LOOKUP_COMMAND = "nameserver"; static final String REGISTRAR_LOOKUP_COMMAND = "registrar"; - private final Reader reader; private final DateTime now; private final WhoisCommandFactory commandFactory; /** Creates a new WhoisReader that extracts its command from the specified Reader. */ - WhoisReader(Reader reader, WhoisCommandFactory commandFactory, DateTime now) { - this.reader = checkNotNull(reader, "reader"); - this.commandFactory = checkNotNull(commandFactory, "commandFactory"); - this.now = checkNotNull(now, "now"); + @Inject + WhoisReader( + @Provided @Config("whoisCommandFactory") WhoisCommandFactory commandFactory, DateTime now) { + this.commandFactory = commandFactory; + this.now = now; } /** @@ -86,8 +91,8 @@ class WhoisReader { * @throws IOException If the command could not be read from the reader. * @throws WhoisException If the command could not be parsed as a WhoisCommand. */ - WhoisCommand readCommand() throws IOException, WhoisException { - return parseCommand(CharStreams.toString(reader)); + WhoisCommand readCommand(Reader reader) throws IOException, WhoisException { + return parseCommand(CharStreams.toString(checkNotNull(reader, "reader"))); } /** @@ -97,7 +102,6 @@ class WhoisReader { private WhoisCommand parseCommand(String command) throws WhoisException { // Split the string into tokens based on whitespace. List tokens = filterEmptyStrings(command.split("\\s")); - if (tokens.isEmpty()) { throw new WhoisException(now, SC_BAD_REQUEST, "No WHOIS command specified."); } diff --git a/java/google/registry/whois/WhoisServer.java b/java/google/registry/whois/WhoisServer.java index b7264d851..975544770 100644 --- a/java/google/registry/whois/WhoisServer.java +++ b/java/google/registry/whois/WhoisServer.java @@ -58,7 +58,7 @@ public class WhoisServer implements Runnable { @Inject Clock clock; @Inject Reader input; @Inject Response response; - @Inject @Config("whoisCommandFactory") WhoisCommandFactory commandFactory; + @Inject WhoisReaderFactory whoisReaderFactory; @Inject @Config("whoisDisclaimer") String disclaimer; @Inject WhoisServer() {} @@ -68,8 +68,9 @@ public class WhoisServer implements Runnable { DateTime now = clock.nowUtc(); try { responseText = - new WhoisReader(input, commandFactory, now) - .readCommand() + whoisReaderFactory + .create(now) + .readCommand(input) .executeQuery(now) .getPlainTextOutput(PREFER_UNICODE, disclaimer); } catch (WhoisException e) { diff --git a/javatests/google/registry/whois/WhoisHttpServerTest.java b/javatests/google/registry/whois/WhoisHttpServerTest.java index 1bfac7a9d..0772f3299 100644 --- a/javatests/google/registry/whois/WhoisHttpServerTest.java +++ b/javatests/google/registry/whois/WhoisHttpServerTest.java @@ -34,6 +34,7 @@ import google.registry.testing.AppEngineRule; import google.registry.testing.FakeClock; import google.registry.testing.FakeResponse; import google.registry.testing.InjectRule; +import google.registry.testing.Providers; import org.joda.time.DateTime; import org.joda.time.Duration; import org.junit.After; @@ -53,26 +54,22 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class WhoisHttpServerTest { - @Rule - public final AppEngineRule appEngine = AppEngineRule.builder() - .withDatastore() - .build(); - - @Rule - public final InjectRule inject = new InjectRule(); + @Rule public final AppEngineRule appEngine = AppEngineRule.builder().withDatastore().build(); + @Rule public final InjectRule inject = new InjectRule(); private final FakeResponse response = new FakeResponse(); private final FakeClock clock = new FakeClock(DateTime.parse("2009-06-29T20:13:00Z")); private WhoisHttpServer newWhoisHttpServer(String pathInfo) { - WhoisHttpServer result = new WhoisHttpServer(); - result.clock = clock; - result.expires = Duration.standardHours(1); - result.requestPath = WhoisHttpServer.PATH + pathInfo; - result.response = response; - result.disclaimer = "Doodle Disclaimer"; - result.commandFactory = new WhoisCommandFactory(); - return result; + WhoisHttpServer whoisServer = new WhoisHttpServer(); + whoisServer.clock = clock; + whoisServer.expires = Duration.standardHours(1); + whoisServer.requestPath = WhoisHttpServer.PATH + pathInfo; + whoisServer.response = response; + whoisServer.whoisReaderFactory = + new WhoisReaderFactory(Providers.of(new WhoisCommandFactory())); + whoisServer.disclaimer = "Doodle Disclaimer"; + return whoisServer; } @Before diff --git a/javatests/google/registry/whois/WhoisReaderTest.java b/javatests/google/registry/whois/WhoisReaderTest.java index 1a41f4137..bf36d1851 100644 --- a/javatests/google/registry/whois/WhoisReaderTest.java +++ b/javatests/google/registry/whois/WhoisReaderTest.java @@ -45,8 +45,8 @@ public class WhoisReaderTest { @SuppressWarnings("unchecked") // XXX: Generic abuse ftw. T readCommand(String commandStr) throws Exception { return (T) - new WhoisReader(new StringReader(commandStr), new WhoisCommandFactory(), clock.nowUtc()) - .readCommand(); + new WhoisReader(new WhoisCommandFactory(), clock.nowUtc()) + .readCommand(new StringReader(commandStr)); } void assertLoadsExampleTld(String commandString) throws Exception { diff --git a/javatests/google/registry/whois/WhoisServerTest.java b/javatests/google/registry/whois/WhoisServerTest.java index 6d9002d32..910e9edb7 100644 --- a/javatests/google/registry/whois/WhoisServerTest.java +++ b/javatests/google/registry/whois/WhoisServerTest.java @@ -36,6 +36,7 @@ import google.registry.testing.AppEngineRule; import google.registry.testing.FakeClock; import google.registry.testing.FakeResponse; import google.registry.testing.InjectRule; +import google.registry.testing.Providers; import java.io.StringReader; import org.joda.time.DateTime; import org.junit.Before; @@ -49,25 +50,21 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class WhoisServerTest { - @Rule - public final AppEngineRule appEngine = AppEngineRule.builder() - .withDatastore() - .build(); - - @Rule - public final InjectRule inject = new InjectRule(); + @Rule public final AppEngineRule appEngine = AppEngineRule.builder().withDatastore().build(); + @Rule public final InjectRule inject = new InjectRule(); private final FakeResponse response = new FakeResponse(); private final FakeClock clock = new FakeClock(DateTime.parse("2009-06-29T20:13:00Z")); private WhoisServer newWhoisServer(String input) { - WhoisServer result = new WhoisServer(); - result.clock = clock; - result.input = new StringReader(input); - result.response = response; - result.disclaimer = "Doodle Disclaimer"; - result.commandFactory = new WhoisCommandFactory(); - return result; + WhoisServer whoisServer = new WhoisServer(); + whoisServer.clock = clock; + whoisServer.input = new StringReader(input); + whoisServer.response = response; + whoisServer.whoisReaderFactory = + new WhoisReaderFactory(Providers.of(new WhoisCommandFactory())); + whoisServer.disclaimer = "Doodle Disclaimer"; + return whoisServer; } @Before