mirror of
https://github.com/google/nomulus.git
synced 2025-05-13 16:07:15 +02:00
Remove Builder type param on RequestComponentBuilder/RequestHandler
It turns out this type parameter was never necessary. A builder only needs the reflexive second type parameter when you want to have a builder inheritance hierarchy where the descendant builders have methods that the ancestor builder doesn't. In that case, the type param enables the ancestor builder's setter methods to automatically return the correct derived type, so that if you start with a derived builder, you can call a setter method inherited from an ancestor and then continue the chain with setters from the derived builder (e.g. new ContactResource.Builder().setCreationTime(now).setContactId(), which otherwise would have returned an EppResource.Builder from setCreationTime(), at which point the call to setContactId() would not compile). Even then, it's not strictly necessary to use the type parameter, since you could instead just have each derived type override every inherited method to specify itself as the return type. But that would be a lot of extra boilerplate and brittleness. Anyway, in this case, there is a builder hierarchy, but RequestComponentBuilder specifies all the methods that we're ever going to want on our builders, so there's never any need to be able to call specific derived builder methods. We only even need the individual builder classes so that Dagger can generate them separately for each component. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=148269178
This commit is contained in:
parent
16832323d0
commit
1e7fc4d64d
9 changed files with 17 additions and 21 deletions
|
@ -136,7 +136,7 @@ interface BackendRequestComponent {
|
||||||
VerifyEntityIntegrityAction verifyEntityIntegrityAction();
|
VerifyEntityIntegrityAction verifyEntityIntegrityAction();
|
||||||
|
|
||||||
@Subcomponent.Builder
|
@Subcomponent.Builder
|
||||||
abstract class Builder implements RequestComponentBuilder<BackendRequestComponent, Builder> {
|
abstract class Builder implements RequestComponentBuilder<BackendRequestComponent> {
|
||||||
@Override public abstract Builder requestModule(RequestModule requestModule);
|
@Override public abstract Builder requestModule(RequestModule requestModule);
|
||||||
@Override public abstract BackendRequestComponent build();
|
@Override public abstract BackendRequestComponent build();
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,8 +22,7 @@ import javax.inject.Inject;
|
||||||
import javax.inject.Provider;
|
import javax.inject.Provider;
|
||||||
|
|
||||||
/** Request handler for the backend module. */
|
/** Request handler for the backend module. */
|
||||||
public class BackendRequestHandler
|
public class BackendRequestHandler extends RequestHandler<BackendRequestComponent> {
|
||||||
extends RequestHandler<BackendRequestComponent, BackendRequestComponent.Builder> {
|
|
||||||
|
|
||||||
@Inject BackendRequestHandler(
|
@Inject BackendRequestHandler(
|
||||||
Provider<BackendRequestComponent.Builder> componentBuilderProvider,
|
Provider<BackendRequestComponent.Builder> componentBuilderProvider,
|
||||||
|
|
|
@ -81,7 +81,7 @@ interface FrontendRequestComponent {
|
||||||
WhoisServer whoisServer();
|
WhoisServer whoisServer();
|
||||||
|
|
||||||
@Subcomponent.Builder
|
@Subcomponent.Builder
|
||||||
abstract class Builder implements RequestComponentBuilder<FrontendRequestComponent, Builder> {
|
abstract class Builder implements RequestComponentBuilder<FrontendRequestComponent> {
|
||||||
@Override public abstract Builder requestModule(RequestModule requestModule);
|
@Override public abstract Builder requestModule(RequestModule requestModule);
|
||||||
@Override public abstract FrontendRequestComponent build();
|
@Override public abstract FrontendRequestComponent build();
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,8 +22,7 @@ import javax.inject.Inject;
|
||||||
import javax.inject.Provider;
|
import javax.inject.Provider;
|
||||||
|
|
||||||
/** Request handler for the frontend module. */
|
/** Request handler for the frontend module. */
|
||||||
public class FrontendRequestHandler
|
public class FrontendRequestHandler extends RequestHandler<FrontendRequestComponent> {
|
||||||
extends RequestHandler<FrontendRequestComponent, FrontendRequestComponent.Builder> {
|
|
||||||
|
|
||||||
@Inject FrontendRequestHandler(
|
@Inject FrontendRequestHandler(
|
||||||
Provider<FrontendRequestComponent.Builder> componentBuilderProvider,
|
Provider<FrontendRequestComponent.Builder> componentBuilderProvider,
|
||||||
|
|
|
@ -81,7 +81,7 @@ interface ToolsRequestComponent {
|
||||||
VerifyOteAction verifyOteAction();
|
VerifyOteAction verifyOteAction();
|
||||||
|
|
||||||
@Subcomponent.Builder
|
@Subcomponent.Builder
|
||||||
abstract class Builder implements RequestComponentBuilder<ToolsRequestComponent, Builder> {
|
abstract class Builder implements RequestComponentBuilder<ToolsRequestComponent> {
|
||||||
@Override public abstract Builder requestModule(RequestModule requestModule);
|
@Override public abstract Builder requestModule(RequestModule requestModule);
|
||||||
@Override public abstract ToolsRequestComponent build();
|
@Override public abstract ToolsRequestComponent build();
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,8 +22,7 @@ import javax.inject.Inject;
|
||||||
import javax.inject.Provider;
|
import javax.inject.Provider;
|
||||||
|
|
||||||
/** Request handler for the tools module. */
|
/** Request handler for the tools module. */
|
||||||
public class ToolsRequestHandler
|
public class ToolsRequestHandler extends RequestHandler<ToolsRequestComponent> {
|
||||||
extends RequestHandler<ToolsRequestComponent, ToolsRequestComponent.Builder> {
|
|
||||||
|
|
||||||
@Inject ToolsRequestHandler(
|
@Inject ToolsRequestHandler(
|
||||||
Provider<ToolsRequestComponent.Builder> componentBuilderProvider,
|
Provider<ToolsRequestComponent.Builder> componentBuilderProvider,
|
||||||
|
|
|
@ -19,7 +19,7 @@ package google.registry.request;
|
||||||
*
|
*
|
||||||
* @see RequestHandler
|
* @see RequestHandler
|
||||||
*/
|
*/
|
||||||
public interface RequestComponentBuilder<C, B extends RequestComponentBuilder<C, B>> {
|
public interface RequestComponentBuilder<C> {
|
||||||
B requestModule(RequestModule requestModule);
|
RequestComponentBuilder<C> requestModule(RequestModule requestModule);
|
||||||
C build();
|
C build();
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,14 +67,13 @@ import javax.servlet.http.HttpServletResponse;
|
||||||
* <p>This class also enforces the {@link Action#requireLogin() requireLogin} setting.
|
* <p>This class also enforces the {@link Action#requireLogin() requireLogin} setting.
|
||||||
*
|
*
|
||||||
* @param <C> request component type
|
* @param <C> request component type
|
||||||
* @param <B> builder for the request component
|
|
||||||
*/
|
*/
|
||||||
public class RequestHandler<C, B extends RequestComponentBuilder<C, B>> {
|
public class RequestHandler<C> {
|
||||||
|
|
||||||
private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass();
|
private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass();
|
||||||
|
|
||||||
private final Router router;
|
private final Router router;
|
||||||
private final Provider<B> requestComponentBuilderProvider;
|
private final Provider<? extends RequestComponentBuilder<C>> requestComponentBuilderProvider;
|
||||||
private final UserService userService;
|
private final UserService userService;
|
||||||
private final RequestAuthenticator requestAuthenticator;
|
private final RequestAuthenticator requestAuthenticator;
|
||||||
private final XsrfTokenManager xsrfTokenManager;
|
private final XsrfTokenManager xsrfTokenManager;
|
||||||
|
@ -94,7 +93,7 @@ public class RequestHandler<C, B extends RequestComponentBuilder<C, B>> {
|
||||||
* @param xsrfTokenManager an instance of the {@link XsrfTokenManager} class
|
* @param xsrfTokenManager an instance of the {@link XsrfTokenManager} class
|
||||||
*/
|
*/
|
||||||
protected RequestHandler(
|
protected RequestHandler(
|
||||||
Provider<B> requestComponentBuilderProvider,
|
Provider<? extends RequestComponentBuilder<C>> requestComponentBuilderProvider,
|
||||||
UserService userService,
|
UserService userService,
|
||||||
RequestAuthenticator requestAuthenticator,
|
RequestAuthenticator requestAuthenticator,
|
||||||
XsrfTokenManager xsrfTokenManager) {
|
XsrfTokenManager xsrfTokenManager) {
|
||||||
|
@ -103,9 +102,9 @@ public class RequestHandler<C, B extends RequestComponentBuilder<C, B>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Creates a new RequestHandler with an explicit component class for test purposes. */
|
/** Creates a new RequestHandler with an explicit component class for test purposes. */
|
||||||
public static <C, B extends RequestComponentBuilder<C, B>> RequestHandler<C, B> createForTest(
|
public static <C> RequestHandler<C> createForTest(
|
||||||
Class<C> component,
|
Class<C> component,
|
||||||
Provider<B> requestComponentBuilderProvider,
|
Provider<? extends RequestComponentBuilder<C>> requestComponentBuilderProvider,
|
||||||
UserService userService,
|
UserService userService,
|
||||||
RequestAuthenticator requestAuthenticator,
|
RequestAuthenticator requestAuthenticator,
|
||||||
XsrfTokenManager xsrfTokenManager) {
|
XsrfTokenManager xsrfTokenManager) {
|
||||||
|
@ -119,7 +118,7 @@ public class RequestHandler<C, B extends RequestComponentBuilder<C, B>> {
|
||||||
|
|
||||||
private RequestHandler(
|
private RequestHandler(
|
||||||
@Nullable Class<C> component,
|
@Nullable Class<C> component,
|
||||||
Provider<B> requestComponentBuilderProvider,
|
Provider<? extends RequestComponentBuilder<C>> requestComponentBuilderProvider,
|
||||||
UserService userService,
|
UserService userService,
|
||||||
RequestAuthenticator requestAuthenticator,
|
RequestAuthenticator requestAuthenticator,
|
||||||
XsrfTokenManager xsrfTokenManager) {
|
XsrfTokenManager xsrfTokenManager) {
|
||||||
|
|
|
@ -194,7 +194,7 @@ public final class RequestHandlerTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Fake Builder for the fake component above to satisfy RequestHandler expectations. */
|
/** Fake Builder for the fake component above to satisfy RequestHandler expectations. */
|
||||||
public abstract class Builder implements RequestComponentBuilder<Component, Builder> {
|
public abstract class Builder implements RequestComponentBuilder<Component> {
|
||||||
@Override
|
@Override
|
||||||
public Builder requestModule(RequestModule requestModule) {
|
public Builder requestModule(RequestModule requestModule) {
|
||||||
component.setRequestModule(requestModule);
|
component.setRequestModule(requestModule);
|
||||||
|
@ -222,7 +222,7 @@ public final class RequestHandlerTest {
|
||||||
|
|
||||||
private final Component component = new Component();
|
private final Component component = new Component();
|
||||||
private final StringWriter httpOutput = new StringWriter();
|
private final StringWriter httpOutput = new StringWriter();
|
||||||
private RequestHandler<Component, Builder> handler;
|
private RequestHandler<Component> handler;
|
||||||
private AuthResult providedAuthResult = null;
|
private AuthResult providedAuthResult = null;
|
||||||
private final User testUser = new User("test@example.com", "test@example.com");
|
private final User testUser = new User("test@example.com", "test@example.com");
|
||||||
private RequestAuthenticator requestAuthenticator;
|
private RequestAuthenticator requestAuthenticator;
|
||||||
|
@ -244,7 +244,7 @@ public final class RequestHandlerTest {
|
||||||
new LegacyAuthenticationMechanism(userService));
|
new LegacyAuthenticationMechanism(userService));
|
||||||
|
|
||||||
// Initialize here, not inline, so that we pick up the mocked UserService.
|
// Initialize here, not inline, so that we pick up the mocked UserService.
|
||||||
handler = RequestHandler.<Component, Builder>createForTest(
|
handler = RequestHandler.<Component>createForTest(
|
||||||
Component.class,
|
Component.class,
|
||||||
Providers.<Builder>of(new Builder() {
|
Providers.<Builder>of(new Builder() {
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue