32
32
import io .trino .aws .proxy .server .credentials .CredentialsModule ;
33
33
import io .trino .aws .proxy .server .credentials .file .FileBasedCredentialsModule ;
34
34
import io .trino .aws .proxy .server .credentials .http .HttpCredentialsModule ;
35
- import io .trino .aws .proxy .server .remote .DefaultRemoteS3Module ;
35
+ import io .trino .aws .proxy .server .remote .DefaultRemoteS3FacadeFactory ;
36
36
import io .trino .aws .proxy .server .remote .RemoteS3ConnectionController ;
37
+ import io .trino .aws .proxy .server .remote .RemoteS3FacadeManager ;
37
38
import io .trino .aws .proxy .server .rest .LimitStreamController ;
38
39
import io .trino .aws .proxy .server .rest .ResourceSecurityDynamicFeature ;
39
40
import io .trino .aws .proxy .server .rest .RestModule ;
50
51
import io .trino .aws .proxy .server .signing .SigningControllerConfig ;
51
52
import io .trino .aws .proxy .server .signing .SigningModule ;
52
53
import io .trino .aws .proxy .spi .plugin .TrinoAwsProxyServerPlugin ;
53
- import io .trino .aws .proxy .spi .plugin .config .RemoteS3Config ;
54
54
import io .trino .aws .proxy .spi .plugin .config .RemoteS3ConnectionProviderConfig ;
55
55
import io .trino .aws .proxy .spi .plugin .config .S3RequestRewriterConfig ;
56
56
import io .trino .aws .proxy .spi .plugin .config .S3SecurityFacadeProviderConfig ;
57
57
import io .trino .aws .proxy .spi .remote .RemoteS3ConnectionProvider ;
58
58
import io .trino .aws .proxy .spi .remote .RemoteS3Facade ;
59
+ import io .trino .aws .proxy .spi .remote .RemoteS3FacadeFactory ;
59
60
import io .trino .aws .proxy .spi .remote .RemoteUriFacade ;
60
61
import io .trino .aws .proxy .spi .rest .S3RequestRewriter ;
61
62
import io .trino .aws .proxy .spi .security .S3SecurityFacadeProvider ;
68
69
69
70
import static com .google .inject .multibindings .Multibinder .newSetBinder ;
70
71
import static com .google .inject .multibindings .OptionalBinder .newOptionalBinder ;
71
- import static io .airlift .configuration .ConditionalModule .conditionalModule ;
72
72
import static io .airlift .configuration .ConfigBinder .configBinder ;
73
73
import static io .airlift .http .client .HttpClientBinder .httpClientBinder ;
74
74
import static io .airlift .http .server .HttpServerBinder .httpServerBinder ;
75
75
import static io .airlift .jaxrs .JaxrsBinder .jaxrsBinder ;
76
+ import static io .trino .aws .proxy .spi .plugin .TrinoAwsProxyServerBinding .remoteS3FacadeFactory ;
76
77
import static org .weakref .jmx .guice .ExportBinder .newExporter ;
77
78
78
79
public class TrinoAwsProxyServerModule
79
80
extends AbstractConfigurationAwareModule
80
81
{
81
82
private static final Logger log = Logger .get (TrinoAwsProxyServerModule .class );
82
83
83
- @ Provides
84
- @ Singleton
85
- public RemoteUriFacade remoteUriFacade (RemoteS3Facade remoteS3Facade )
86
- {
87
- return remoteS3Facade ;
88
- }
89
-
90
84
@ Override
91
85
protected void setup (Binder binder )
92
86
{
@@ -116,6 +110,7 @@ protected void setup(Binder binder)
116
110
httpServerBinder .enableLegacyUriCompliance ();
117
111
httpServerBinder .enableCaseSensitiveHeaderCache ();
118
112
113
+ // RemoteS3ConnectionProvider binder
119
114
configBinder (binder ).bindConfig (RemoteS3ConnectionProviderConfig .class );
120
115
newOptionalBinder (binder , RemoteS3ConnectionProvider .class ).setDefault ().toProvider (() -> {
121
116
log .info ("Using default %s NOOP implementation" , RemoteS3ConnectionProvider .class .getSimpleName ());
@@ -141,13 +136,12 @@ protected void setup(Binder binder)
141
136
install (new OpaS3SecurityModule ());
142
137
install (new HttpCredentialsModule ());
143
138
144
- // RemoteS3 binder
145
- newOptionalBinder (binder , RemoteS3Facade .class );
146
- // RemoteS3 provided implementation
147
- install (conditionalModule (
148
- RemoteS3Config .class ,
149
- config -> config .getPluginIdentifier ().isEmpty (),
150
- new DefaultRemoteS3Module ()));
139
+ // RemoteS3Facade binder
140
+ newSetBinder (binder , RemoteS3FacadeFactory .class ); // This isn't strictly necessary because we install the DefaultRemoteS3FacadeFactory so that creates the SetBinder,
141
+ // but we keep it to be explicit
142
+ installRemoteS3FacadeManager (binder );
143
+ // RemoteS3Facade provided implementation
144
+ install (remoteS3FacadeFactory (DefaultRemoteS3FacadeFactory .class ));
151
145
152
146
installSigningController (binder );
153
147
installS3SecurityController (binder );
@@ -172,6 +166,20 @@ public XmlMapper newXmlMapper()
172
166
return xmlMapper ;
173
167
}
174
168
169
+ @ Provides
170
+ @ Singleton
171
+ public RemoteUriFacade remoteUriFacade (RemoteS3FacadeManager remoteS3FacadeManager )
172
+ {
173
+ return remoteS3FacadeManager ;
174
+ }
175
+
176
+ @ Provides
177
+ @ Singleton
178
+ public RemoteS3Facade remoteS3Facade (RemoteS3FacadeManager remoteS3FacadeManager )
179
+ {
180
+ return remoteS3FacadeManager ;
181
+ }
182
+
175
183
public static void bindResourceAtPath (JaxrsBinder jaxrsBinder , Class <?> resourceClass , String resourcePrefix )
176
184
{
177
185
jaxrsBinder .bind (resourceClass );
@@ -191,6 +199,13 @@ protected void installSigningController(Binder binder)
191
199
install (new SigningModule ());
192
200
}
193
201
202
+ @ VisibleForTesting
203
+ protected void installRemoteS3FacadeManager (Binder binder )
204
+ {
205
+ binder .bind (RemoteS3FacadeManager .class ).in (Scopes .SINGLETON );
206
+ binder .bind (RemoteS3Facade .class ).to (RemoteS3FacadeManager .class ).in (Scopes .SINGLETON );
207
+ }
208
+
194
209
private void addNullCollectionModule (Binder binder )
195
210
{
196
211
Module module = new SimpleModule ()
0 commit comments