mirror of
https://github.com/google/nomulus.git
synced 2025-05-14 00:17:20 +02:00
Dagger, meet Flows. Flows, meet Dagger.
Daggerizes all of the EPP flows. This does not change anything yet about the flows themselves, just how they are invoked, but after this CL it's safe to @Inject things into flow classes. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=125382478
This commit is contained in:
parent
116bf1f4d6
commit
c9a16f7f11
69 changed files with 973 additions and 292 deletions
335
java/google/registry/flows/FlowModule.java
Normal file
335
java/google/registry/flows/FlowModule.java
Normal file
|
@ -0,0 +1,335 @@
|
|||
// Copyright 2016 The Domain Registry Authors. All Rights Reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package google.registry.flows;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
import dagger.Module;
|
||||
import dagger.Provides;
|
||||
|
||||
import google.registry.flows.contact.ContactCheckFlow;
|
||||
import google.registry.flows.contact.ContactCreateFlow;
|
||||
import google.registry.flows.contact.ContactDeleteFlow;
|
||||
import google.registry.flows.contact.ContactInfoFlow;
|
||||
import google.registry.flows.contact.ContactTransferApproveFlow;
|
||||
import google.registry.flows.contact.ContactTransferCancelFlow;
|
||||
import google.registry.flows.contact.ContactTransferQueryFlow;
|
||||
import google.registry.flows.contact.ContactTransferRejectFlow;
|
||||
import google.registry.flows.contact.ContactTransferRequestFlow;
|
||||
import google.registry.flows.contact.ContactUpdateFlow;
|
||||
import google.registry.flows.domain.ClaimsCheckFlow;
|
||||
import google.registry.flows.domain.DomainAllocateFlow;
|
||||
import google.registry.flows.domain.DomainApplicationCreateFlow;
|
||||
import google.registry.flows.domain.DomainApplicationDeleteFlow;
|
||||
import google.registry.flows.domain.DomainApplicationInfoFlow;
|
||||
import google.registry.flows.domain.DomainApplicationUpdateFlow;
|
||||
import google.registry.flows.domain.DomainCheckFlow;
|
||||
import google.registry.flows.domain.DomainCreateFlow;
|
||||
import google.registry.flows.domain.DomainDeleteFlow;
|
||||
import google.registry.flows.domain.DomainInfoFlow;
|
||||
import google.registry.flows.domain.DomainRenewFlow;
|
||||
import google.registry.flows.domain.DomainRestoreRequestFlow;
|
||||
import google.registry.flows.domain.DomainTransferApproveFlow;
|
||||
import google.registry.flows.domain.DomainTransferCancelFlow;
|
||||
import google.registry.flows.domain.DomainTransferQueryFlow;
|
||||
import google.registry.flows.domain.DomainTransferRejectFlow;
|
||||
import google.registry.flows.domain.DomainTransferRequestFlow;
|
||||
import google.registry.flows.domain.DomainUpdateFlow;
|
||||
import google.registry.flows.host.HostCheckFlow;
|
||||
import google.registry.flows.host.HostCreateFlow;
|
||||
import google.registry.flows.host.HostDeleteFlow;
|
||||
import google.registry.flows.host.HostInfoFlow;
|
||||
import google.registry.flows.host.HostUpdateFlow;
|
||||
import google.registry.flows.picker.FlowPicker;
|
||||
import google.registry.flows.poll.PollAckFlow;
|
||||
import google.registry.flows.poll.PollRequestFlow;
|
||||
import google.registry.flows.session.HelloFlow;
|
||||
import google.registry.flows.session.LoginFlow;
|
||||
import google.registry.flows.session.LogoutFlow;
|
||||
import google.registry.model.eppcommon.Trid;
|
||||
import google.registry.model.eppinput.EppInput;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.inject.Provider;
|
||||
import javax.inject.Qualifier;
|
||||
|
||||
/** Module to choose and instantiate an EPP flow. */
|
||||
@Module
|
||||
public class FlowModule {
|
||||
|
||||
private EppInput eppInput;
|
||||
private byte[] inputXmlBytes;
|
||||
private SessionMetadata sessionMetadata;
|
||||
private TransportCredentials credentials;
|
||||
private boolean isDryRun;
|
||||
private EppRequestSource eppRequestSource;
|
||||
private boolean isSuperuser;
|
||||
|
||||
private FlowModule() {}
|
||||
|
||||
/** Builder for {@link FlowModule}. */
|
||||
static class Builder {
|
||||
FlowModule module = new FlowModule();
|
||||
|
||||
Builder setEppInput(EppInput eppInput) {
|
||||
module.eppInput = eppInput;
|
||||
return this;
|
||||
}
|
||||
|
||||
Builder setInputXmlBytes(byte[] inputXmlBytes) {
|
||||
module.inputXmlBytes = inputXmlBytes;
|
||||
return this;
|
||||
}
|
||||
|
||||
Builder setSessionMetadata(SessionMetadata sessionMetadata) {
|
||||
module.sessionMetadata = sessionMetadata;
|
||||
return this;
|
||||
}
|
||||
|
||||
Builder setIsDryRun(boolean isDryRun) {
|
||||
module.isDryRun = isDryRun;
|
||||
return this;
|
||||
}
|
||||
|
||||
Builder setIsSuperuser(boolean isSuperuser) {
|
||||
module.isSuperuser = isSuperuser;
|
||||
return this;
|
||||
}
|
||||
|
||||
Builder setEppRequestSource(EppRequestSource eppRequestSource) {
|
||||
module.eppRequestSource = eppRequestSource;
|
||||
return this;
|
||||
}
|
||||
|
||||
Builder setCredentials(TransportCredentials credentials) {
|
||||
module.credentials = credentials;
|
||||
return this;
|
||||
}
|
||||
|
||||
FlowModule build() {
|
||||
try {
|
||||
checkState(module != null, "Already built");
|
||||
return module;
|
||||
} finally {
|
||||
module = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FlowScope
|
||||
@InputXml
|
||||
byte[] provideInputXml() {
|
||||
return inputXmlBytes;
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FlowScope
|
||||
EppInput provideEppInput() {
|
||||
return eppInput;
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FlowScope
|
||||
SessionMetadata provideSessionMetadata() {
|
||||
return sessionMetadata;
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FlowScope
|
||||
@DryRun
|
||||
boolean provideIsDryRun() {
|
||||
return isDryRun;
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FlowScope
|
||||
@Transactional
|
||||
boolean provideIsTransactional(Class<? extends Flow> flowClass) {
|
||||
return TransactionalFlow.class.isAssignableFrom(flowClass);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FlowScope
|
||||
@Superuser
|
||||
boolean provideIsSuperuser() {
|
||||
return isSuperuser;
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FlowScope
|
||||
EppRequestSource provideEppRequestSource() {
|
||||
return eppRequestSource;
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FlowScope
|
||||
TransportCredentials provideTransportCredentials() {
|
||||
return credentials;
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FlowScope
|
||||
@Nullable
|
||||
@ClientId
|
||||
static String provideClientId(SessionMetadata sessionMetadata) {
|
||||
return sessionMetadata.getClientId();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FlowScope
|
||||
static Trid provideTrid(EppInput eppInput) {
|
||||
return Trid.create(eppInput.getCommandWrapper().getClTrid());
|
||||
}
|
||||
|
||||
/** Provides a mapping between flow classes and injected providers. */
|
||||
@Provides
|
||||
@FlowScope
|
||||
static Map<Class<? extends Flow>, Provider<? extends Flow>> provideFlowClassMap(
|
||||
Provider<ContactCheckFlow> contactCheckFlowProvider,
|
||||
Provider<ContactCreateFlow> contactCreateFlowProvider,
|
||||
Provider<ContactDeleteFlow> contactDeleteFlowProvider,
|
||||
Provider<ContactInfoFlow> contactInfoFlowProvider,
|
||||
Provider<ContactTransferApproveFlow> contactTransferApproveFlowProvider,
|
||||
Provider<ContactTransferCancelFlow> contactTransferCancelFlowProvider,
|
||||
Provider<ContactTransferQueryFlow> contactTransferQueryFlowProvider,
|
||||
Provider<ContactTransferRejectFlow> contactTransferRejectFlowProvider,
|
||||
Provider<ContactTransferRequestFlow> contactTransferRequestFlowProvider,
|
||||
Provider<ContactUpdateFlow> contactUpdateFlowProvider,
|
||||
Provider<ClaimsCheckFlow> claimsCheckFlowProvider,
|
||||
Provider<DomainAllocateFlow> domainAllocateFlowProvider,
|
||||
Provider<DomainApplicationCreateFlow> domainApplicationCreateFlowProvider,
|
||||
Provider<DomainApplicationDeleteFlow> domainApplicationDeleteFlowProvider,
|
||||
Provider<DomainApplicationInfoFlow> domainApplicationInfoFlowProvider,
|
||||
Provider<DomainApplicationUpdateFlow> domainApplicationUpdateFlowProvider,
|
||||
Provider<DomainCheckFlow> domainCheckFlowProvider,
|
||||
Provider<DomainCreateFlow> domainCreateFlowProvider,
|
||||
Provider<DomainDeleteFlow> domainDeleteFlowProvider,
|
||||
Provider<DomainInfoFlow> domainInfoFlowProvider,
|
||||
Provider<DomainRenewFlow> domainRenewFlowProvider,
|
||||
Provider<DomainRestoreRequestFlow> domainRestoreRequestFlowProvider,
|
||||
Provider<DomainTransferApproveFlow> domainTransferApproveFlowProvider,
|
||||
Provider<DomainTransferCancelFlow> domainTransferCancelFlowProvider,
|
||||
Provider<DomainTransferQueryFlow> domainTransferQueryFlowProvider,
|
||||
Provider<DomainTransferRejectFlow> domainTransferRejectFlowProvider,
|
||||
Provider<DomainTransferRequestFlow> domainTransferRequestFlowProvider,
|
||||
Provider<DomainUpdateFlow> domainUpdateFlowProvider,
|
||||
Provider<HostCheckFlow> hostCheckFlowProvider,
|
||||
Provider<HostCreateFlow> hostCreateFlowProvider,
|
||||
Provider<HostDeleteFlow> hostDeleteFlowProvider,
|
||||
Provider<HostInfoFlow> hostInfoFlowProvider,
|
||||
Provider<HostUpdateFlow> hostUpdateFlowProvider,
|
||||
Provider<PollAckFlow> pollAckFlowProvider,
|
||||
Provider<PollRequestFlow> pollRequestFlowProvider,
|
||||
Provider<HelloFlow> helloFlowProvider,
|
||||
Provider<LoginFlow> loginFlowProvider,
|
||||
Provider<LogoutFlow> logoutFlowProvider) {
|
||||
return new ImmutableMap.Builder<Class<? extends Flow>, Provider<? extends Flow>>()
|
||||
.put(ContactCheckFlow.class, contactCheckFlowProvider)
|
||||
.put(ContactCreateFlow.class, contactCreateFlowProvider)
|
||||
.put(ContactDeleteFlow.class, contactDeleteFlowProvider)
|
||||
.put(ContactInfoFlow.class, contactInfoFlowProvider)
|
||||
.put(ContactTransferApproveFlow.class, contactTransferApproveFlowProvider)
|
||||
.put(ContactTransferCancelFlow.class, contactTransferCancelFlowProvider)
|
||||
.put(ContactTransferQueryFlow.class, contactTransferQueryFlowProvider)
|
||||
.put(ContactTransferRejectFlow.class, contactTransferRejectFlowProvider)
|
||||
.put(ContactTransferRequestFlow.class, contactTransferRequestFlowProvider)
|
||||
.put(ContactUpdateFlow.class, contactUpdateFlowProvider)
|
||||
.put(ClaimsCheckFlow.class, claimsCheckFlowProvider)
|
||||
.put(DomainAllocateFlow.class, domainAllocateFlowProvider)
|
||||
.put(DomainApplicationCreateFlow.class, domainApplicationCreateFlowProvider)
|
||||
.put(DomainApplicationDeleteFlow.class, domainApplicationDeleteFlowProvider)
|
||||
.put(DomainApplicationInfoFlow.class, domainApplicationInfoFlowProvider)
|
||||
.put(DomainApplicationUpdateFlow.class, domainApplicationUpdateFlowProvider)
|
||||
.put(DomainCheckFlow.class, domainCheckFlowProvider)
|
||||
.put(DomainCreateFlow.class, domainCreateFlowProvider)
|
||||
.put(DomainDeleteFlow.class, domainDeleteFlowProvider)
|
||||
.put(DomainInfoFlow.class, domainInfoFlowProvider)
|
||||
.put(DomainRenewFlow.class, domainRenewFlowProvider)
|
||||
.put(DomainRestoreRequestFlow.class, domainRestoreRequestFlowProvider)
|
||||
.put(DomainTransferApproveFlow.class, domainTransferApproveFlowProvider)
|
||||
.put(DomainTransferCancelFlow.class, domainTransferCancelFlowProvider)
|
||||
.put(DomainTransferQueryFlow.class, domainTransferQueryFlowProvider)
|
||||
.put(DomainTransferRejectFlow.class, domainTransferRejectFlowProvider)
|
||||
.put(DomainTransferRequestFlow.class, domainTransferRequestFlowProvider)
|
||||
.put(DomainUpdateFlow.class, domainUpdateFlowProvider)
|
||||
.put(HostCheckFlow.class, hostCheckFlowProvider)
|
||||
.put(HostCreateFlow.class, hostCreateFlowProvider)
|
||||
.put(HostDeleteFlow.class, hostDeleteFlowProvider)
|
||||
.put(HostInfoFlow.class, hostInfoFlowProvider)
|
||||
.put(HostUpdateFlow.class, hostUpdateFlowProvider)
|
||||
.put(PollAckFlow.class, pollAckFlowProvider)
|
||||
.put(PollRequestFlow.class, pollRequestFlowProvider)
|
||||
.put(HelloFlow.class, helloFlowProvider)
|
||||
.put(LoginFlow.class, loginFlowProvider)
|
||||
.put(LogoutFlow.class, logoutFlowProvider)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FlowScope
|
||||
static Class<? extends Flow> provideFlowClass(EppInput eppInput) {
|
||||
try {
|
||||
return FlowPicker.getFlowClass(eppInput);
|
||||
} catch (EppException e) {
|
||||
throw new EppExceptionInProviderException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FlowScope
|
||||
static Flow provideFlow(
|
||||
Map<Class<? extends Flow>, Provider<? extends Flow>> flowProviders,
|
||||
Class<? extends Flow> flowClass) {
|
||||
return flowProviders.get(flowClass).get();
|
||||
}
|
||||
|
||||
/** Wrapper class to carry an {@link EppException} to the calling code. */
|
||||
static class EppExceptionInProviderException extends RuntimeException {
|
||||
EppExceptionInProviderException(EppException exception) {
|
||||
super(exception);
|
||||
}
|
||||
}
|
||||
|
||||
/** Dagger qualifier for inputXml. */
|
||||
@Qualifier
|
||||
@Documented
|
||||
public @interface InputXml {}
|
||||
|
||||
/** Dagger qualifier for registrar client id. */
|
||||
@Qualifier
|
||||
@Documented
|
||||
public @interface ClientId {}
|
||||
|
||||
/** Dagger qualifier for whether a flow is in dry run mode. */
|
||||
@Qualifier
|
||||
@Documented
|
||||
public @interface DryRun {}
|
||||
|
||||
/** Dagger qualifier for whether a flow is in superuser mode. */
|
||||
@Qualifier
|
||||
@Documented
|
||||
public @interface Superuser {}
|
||||
|
||||
/** Dagger qualifier for whether a flow is transactional. */
|
||||
@Qualifier
|
||||
@Documented
|
||||
public @interface Transactional {}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue