Skip to content
This repository was archived by the owner on May 28, 2018. It is now read-only.

Commit c79eb3a

Browse files
author
Petr Bouda
committed
Breaking down initialization process using implementations of BootstrapConfigurator.
- introduced interface BootstrapConfigurator which represents a single initialization step - each step defines init phase (dedicated to register into InjectionManager) and post-init phase (getting from InjectionManager) - step should be focused on the processing of single problem domain - configurators are dependent on the order of their processing InjectionManagerFactory - every DI provider must provider its own InjectionManagerFactory implementation which is available using ServiceLoader - contains a logic to create an implementation of InjectionManager Change-Id: I35fc2ad6b06e5b5cb45a9bddab8366019801f77a
1 parent eb092a6 commit c79eb3a

File tree

100 files changed

+3786
-1809
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+3786
-1809
lines changed

core-client/src/main/java/org/glassfish/jersey/client/ClientBinder.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,14 @@
5252
import javax.inject.Provider;
5353
import javax.inject.Singleton;
5454

55-
import org.glassfish.jersey.internal.ContextResolverFactory;
5655
import org.glassfish.jersey.internal.JaxrsProviders;
5756
import org.glassfish.jersey.internal.PropertiesDelegate;
5857
import org.glassfish.jersey.internal.ServiceFinderBinder;
5958
import org.glassfish.jersey.internal.inject.AbstractBinder;
6059
import org.glassfish.jersey.internal.inject.ReferencingFactory;
6160
import org.glassfish.jersey.internal.spi.AutoDiscoverable;
6261
import org.glassfish.jersey.internal.util.collection.Ref;
63-
import org.glassfish.jersey.message.internal.MessageBodyFactory;
6462
import org.glassfish.jersey.message.internal.MessagingBinders;
65-
import org.glassfish.jersey.process.internal.RequestScope;
6663
import org.glassfish.jersey.process.internal.RequestScoped;
6764
import org.glassfish.jersey.spi.ExecutorServiceProvider;
6865
import org.glassfish.jersey.spi.ScheduledExecutorServiceProvider;
@@ -112,22 +109,19 @@ public PropertiesDelegate get() {
112109

113110
@Override
114111
protected void configure() {
115-
install(new RequestScope.Binder(), // must go first as it registers the request scope instance.
116-
new MessagingBinders.MessageBodyProviders(clientRuntimeProperties, RuntimeType.CLIENT),
112+
install(new MessagingBinders.MessageBodyProviders(clientRuntimeProperties, RuntimeType.CLIENT),
117113
new MessagingBinders.HeaderDelegateProviders(),
118-
new MessageBodyFactory.Binder(),
119-
new ContextResolverFactory.Binder(),
120114
new JaxrsProviders.Binder(),
121115
new ServiceFinderBinder<>(AutoDiscoverable.class, clientRuntimeProperties, RuntimeType.CLIENT));
122116

123-
bindFactory(ReferencingFactory.<ClientConfig>referenceFactory()).to(new GenericType<Ref<ClientConfig>>() {
117+
bindFactory(ReferencingFactory.referenceFactory()).to(new GenericType<Ref<ClientConfig>>() {
124118
}).in(RequestScoped.class);
125119

126120
bindFactory(RequestContextInjectionFactory.class)
127121
.to(ClientRequest.class)
128122
.in(RequestScoped.class);
129123

130-
bindFactory(ReferencingFactory.<ClientRequest>referenceFactory()).to(new GenericType<Ref<ClientRequest>>() {
124+
bindFactory(ReferencingFactory.referenceFactory()).to(new GenericType<Ref<ClientRequest>>() {
131125
}).in(RequestScoped.class);
132126

133127
bindFactory(PropertiesDelegateFactory.class, Singleton.class).to(PropertiesDelegate.class).in(RequestScoped.class);

core-client/src/main/java/org/glassfish/jersey/client/ClientConfig.java

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@
4040

4141
package org.glassfish.jersey.client;
4242

43+
import java.util.Arrays;
4344
import java.util.Collection;
4445
import java.util.Iterator;
46+
import java.util.List;
4547
import java.util.Map;
4648
import java.util.Set;
4749

@@ -55,17 +57,23 @@
5557
import org.glassfish.jersey.client.internal.LocalizationMessages;
5658
import org.glassfish.jersey.client.spi.Connector;
5759
import org.glassfish.jersey.client.spi.ConnectorProvider;
60+
import org.glassfish.jersey.internal.BootstrapBag;
61+
import org.glassfish.jersey.internal.BootstrapConfigurator;
62+
import org.glassfish.jersey.internal.ContextResolverFactory;
63+
import org.glassfish.jersey.internal.ExceptionMapperFactory;
5864
import org.glassfish.jersey.internal.ServiceFinder;
59-
import org.glassfish.jersey.internal.inject.AbstractBinder;
65+
import org.glassfish.jersey.internal.inject.Bindings;
6066
import org.glassfish.jersey.internal.inject.InjectionManager;
6167
import org.glassfish.jersey.internal.inject.Injections;
6268
import org.glassfish.jersey.internal.inject.ProviderBinder;
6369
import org.glassfish.jersey.internal.util.collection.LazyValue;
6470
import org.glassfish.jersey.internal.util.collection.Value;
6571
import org.glassfish.jersey.internal.util.collection.Values;
72+
import org.glassfish.jersey.message.internal.MessageBodyFactory;
6673
import org.glassfish.jersey.model.internal.CommonConfig;
6774
import org.glassfish.jersey.model.internal.ComponentBag;
6875
import org.glassfish.jersey.process.internal.ExecutorProviders;
76+
import org.glassfish.jersey.process.internal.RequestScope;
6977

7078
/**
7179
* Jersey externalized implementation of client-side JAX-RS {@link javax.ws.rs.core.Configurable
@@ -81,6 +89,21 @@ public class ClientConfig implements Configurable<ClientConfig>, ExtendedConfig
8189
*/
8290
private State state;
8391

92+
private static class RuntimeConfigConfigurator implements BootstrapConfigurator {
93+
94+
private final State runtimeConfig;
95+
96+
private RuntimeConfigConfigurator(State runtimeConfig) {
97+
this.runtimeConfig = runtimeConfig;
98+
}
99+
100+
@Override
101+
public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
102+
bootstrapBag.setConfiguration(runtimeConfig);
103+
injectionManager.register(Bindings.service(runtimeConfig).to(Configuration.class));
104+
}
105+
}
106+
84107
/**
85108
* Default encapsulation of the internal configuration state.
86109
*/
@@ -89,36 +112,23 @@ private static class State implements Configurable<State>, ExtendedConfig {
89112
/**
90113
* Strategy that returns the same state instance.
91114
*/
92-
private static final StateChangeStrategy IDENTITY = new StateChangeStrategy() {
93-
94-
@Override
95-
public State onChange(final State state) {
96-
return state;
97-
}
98-
};
115+
private static final StateChangeStrategy IDENTITY = state -> state;
99116
/**
100117
* Strategy that returns a copy of the state instance.
101118
*/
102-
private static final StateChangeStrategy COPY_ON_CHANGE = new StateChangeStrategy() {
103-
104-
@Override
105-
public State onChange(final State state) {
106-
return state.copy();
107-
}
108-
};
119+
private static final StateChangeStrategy COPY_ON_CHANGE = State::copy;
109120

110121
private volatile StateChangeStrategy strategy;
111122
private final CommonConfig commonConfig;
112123
private final JerseyClient client;
113124
private volatile ConnectorProvider connectorProvider;
114125

115-
116126
private final LazyValue<ClientRuntime> runtime = Values.lazy((Value<ClientRuntime>) this::initRuntime);
117127

118128
/**
119129
* Configuration state change strategy.
120130
*/
121-
private static interface StateChangeStrategy {
131+
private interface StateChangeStrategy {
122132

123133
/**
124134
* Invoked whenever a mutator method is called in the given configuration
@@ -128,7 +138,7 @@ private static interface StateChangeStrategy {
128138
* @return state instance that will be mutated and returned from the
129139
* invoked configuration state mutator method.
130140
*/
131-
public State onChange(final State state);
141+
State onChange(final State state);
132142
}
133143

134144
/**
@@ -373,7 +383,7 @@ public ComponentBag getComponentBag() {
373383
*/
374384
@SuppressWarnings("MethodOnlyUsedFromInnerClass")
375385
private ClientRuntime initRuntime() {
376-
/**
386+
/*
377387
* Ensure that any attempt to add a new provider, feature, binder or modify the connector
378388
* will cause a copy of the current state.
379389
*/
@@ -382,8 +392,17 @@ private ClientRuntime initRuntime() {
382392
final State runtimeCfgState = this.copy();
383393
runtimeCfgState.markAsShared();
384394

385-
final InjectionManager injectionManager =
386-
Injections.createInjectionManager(new ClientBinder(runtimeCfgState.getProperties()));
395+
InjectionManager injectionManager = Injections.createInjectionManager();
396+
injectionManager.register(new ClientBinder(runtimeCfgState.getProperties()));
397+
398+
BootstrapBag bootstrapBag = new BootstrapBag();
399+
List<BootstrapConfigurator> bootstrapConfigurators = Arrays.asList(
400+
new RequestScope.RequestScopeConfigurator(),
401+
new RuntimeConfigConfigurator(runtimeCfgState),
402+
new ContextResolverFactory.ContextResolversConfigurator(),
403+
new MessageBodyFactory.MessageBodyWorkersConfigurator(),
404+
new ExceptionMapperFactory.ExceptionMappersConfigurator());
405+
bootstrapConfigurators.forEach(configurator -> configurator.init(injectionManager, bootstrapBag));
387406

388407
// AutoDiscoverable.
389408
if (!CommonProperties.getValue(runtimeCfgState.getProperties(), RuntimeType.CLIENT,
@@ -396,27 +415,21 @@ private ClientRuntime initRuntime() {
396415
// Configure binders and features.
397416
runtimeCfgState.configureMetaProviders(injectionManager);
398417

399-
// Bind configuration.
400-
final AbstractBinder configBinder = new AbstractBinder() {
401-
@Override
402-
protected void configure() {
403-
bind(runtimeCfgState).to(Configuration.class);
404-
}
405-
};
406-
injectionManager.register(configBinder);
407-
408418
// Bind providers.
409419
ProviderBinder.bindProviders(runtimeCfgState.getComponentBag(), RuntimeType.CLIENT, null, injectionManager);
410420

421+
injectionManager.completeRegistration();
422+
423+
bootstrapConfigurators.forEach(configurator -> configurator.postInit(injectionManager, bootstrapBag));
424+
411425
// Bind executors.
412426
ExecutorProviders.createInjectionBindings(injectionManager);
413427

414428
final ClientConfig configuration = new ClientConfig(runtimeCfgState);
415429
final Connector connector = connectorProvider.getConnector(client, configuration);
416-
final ClientRuntime crt = new ClientRuntime(configuration, connector, injectionManager);
430+
final ClientRuntime crt = new ClientRuntime(configuration, connector, injectionManager, bootstrapBag);
417431

418432
client.registerShutdownHook(crt);
419-
420433
return crt;
421434
}
422435

core-client/src/main/java/org/glassfish/jersey/client/ClientRuntime.java

Lines changed: 50 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
package org.glassfish.jersey.client;
4242

43-
import java.util.Arrays;
43+
import java.util.Collections;
4444
import java.util.concurrent.Callable;
4545
import java.util.concurrent.ExecutorService;
4646
import java.util.concurrent.Future;
@@ -52,16 +52,21 @@
5252
import java.util.logging.Logger;
5353

5454
import javax.ws.rs.ProcessingException;
55+
import javax.ws.rs.core.GenericType;
5556
import javax.ws.rs.core.HttpHeaders;
5657
import javax.ws.rs.core.MultivaluedMap;
5758

59+
import javax.inject.Provider;
60+
5861
import org.glassfish.jersey.client.internal.LocalizationMessages;
5962
import org.glassfish.jersey.client.spi.AsyncConnectorCallback;
6063
import org.glassfish.jersey.client.spi.Connector;
64+
import org.glassfish.jersey.internal.BootstrapBag;
6165
import org.glassfish.jersey.internal.Version;
6266
import org.glassfish.jersey.internal.inject.InjectionManager;
6367
import org.glassfish.jersey.internal.inject.Providers;
6468
import org.glassfish.jersey.internal.util.collection.LazyValue;
69+
import org.glassfish.jersey.internal.util.collection.Ref;
6570
import org.glassfish.jersey.internal.util.collection.Value;
6671
import org.glassfish.jersey.internal.util.collection.Values;
6772
import org.glassfish.jersey.message.MessageBodyWorkers;
@@ -98,13 +103,19 @@ class ClientRuntime implements JerseyClient.ShutdownHook, ClientExecutor {
98103
/**
99104
* Create new client request processing runtime.
100105
*
101-
* @param config client runtime configuration.
102-
* @param connector client transport connector.
103-
* @param injectionManager injection manager.
106+
* @param config client runtime configuration.
107+
* @param connector client transport connector.
108+
* @param injectionManager injection manager.
104109
*/
105-
public ClientRuntime(final ClientConfig config, final Connector connector, final InjectionManager injectionManager) {
106-
Stage.Builder<ClientRequest> requestingChainBuilder = Stages
107-
.chain(injectionManager.createAndInitialize(RequestProcessingInitializationStage.class));
110+
public ClientRuntime(final ClientConfig config, final Connector connector, final InjectionManager injectionManager,
111+
final BootstrapBag bootstrapBag) {
112+
Provider<Ref<ClientRequest>> clientRequest =
113+
injectionManager.getInstance(new GenericType<Provider<Ref<ClientRequest>>>() {}.getType());
114+
115+
RequestProcessingInitializationStage requestProcessingInitializationStage =
116+
new RequestProcessingInitializationStage(clientRequest, bootstrapBag.getMessageBodyWorkers(), injectionManager);
117+
118+
Stage.Builder<ClientRequest> requestingChainBuilder = Stages.chain(requestProcessingInitializationStage);
108119

109120
ChainableStage<ClientRequest> requestFilteringStage = ClientFilteringStages.createRequestFilteringStage(injectionManager);
110121
this.requestProcessingRoot = requestFilteringStage != null
@@ -116,12 +127,9 @@ public ClientRuntime(final ClientConfig config, final Connector connector, final
116127

117128
this.config = config;
118129
this.connector = connector;
119-
120-
this.requestScope = injectionManager.getInstance(RequestScope.class);
121-
122-
this.asyncRequestExecutor = Values.lazy((Value<ExecutorService>) ()
123-
-> injectionManager.getInstance(ExecutorService.class, ClientAsyncExecutorLiteral.INSTANCE));
124-
130+
this.requestScope = bootstrapBag.getRequestScope();
131+
this.asyncRequestExecutor = Values.lazy((Value<ExecutorService>)
132+
() -> injectionManager.getInstance(ExecutorService.class, ClientAsyncExecutorLiteral.INSTANCE));
125133
this.backgroundScheduler = Values.lazy((Value<ScheduledExecutorService>) ()
126134
-> injectionManager.getInstance(ScheduledExecutorService.class, ClientBackgroundSchedulerLiteral.INSTANCE));
127135

@@ -146,44 +154,35 @@ public ClientRuntime(final ClientConfig config, final Connector connector, final
146154
* @return {@code Runnable} to be submitted for async processing using {@link #submit(Runnable)}.
147155
*/
148156
Runnable createRunnableForAsyncProcessing(ClientRequest request, final ResponseCallback callback) {
149-
return () -> {
150-
requestScope.runInScope(() -> {
157+
return () -> requestScope.runInScope(() -> {
158+
try {
159+
ClientRequest processedRequest;
151160
try {
152-
ClientRequest processedRequest;
153-
try {
154-
processedRequest = Stages.process(request, requestProcessingRoot);
155-
processedRequest = addUserAgent(processedRequest, connector.getName());
156-
} catch (final AbortException aborted) {
157-
processResponse(aborted.getAbortResponse(), callback);
158-
return;
161+
processedRequest = Stages.process(request, requestProcessingRoot);
162+
processedRequest = addUserAgent(processedRequest, connector.getName());
163+
} catch (final AbortException aborted) {
164+
processResponse(aborted.getAbortResponse(), callback);
165+
return;
166+
}
167+
168+
final AsyncConnectorCallback connectorCallback = new AsyncConnectorCallback() {
169+
170+
@Override
171+
public void response(final ClientResponse response) {
172+
requestScope.runInScope(() -> processResponse(response, callback));
159173
}
160174

161-
final AsyncConnectorCallback connectorCallback = new AsyncConnectorCallback() {
162-
163-
@Override
164-
public void response(final ClientResponse response) {
165-
requestScope.runInScope(new Runnable() {
166-
public void run() {
167-
processResponse(response, callback);
168-
}
169-
});
170-
}
171-
172-
@Override
173-
public void failure(final Throwable failure) {
174-
requestScope.runInScope(new Runnable() {
175-
public void run() {
176-
processFailure(failure, callback);
177-
}
178-
});
179-
}
180-
};
181-
connector.apply(processedRequest, connectorCallback);
182-
} catch (final Throwable throwable) {
183-
processFailure(throwable, callback);
184-
}
185-
});
186-
};
175+
@Override
176+
public void failure(final Throwable failure) {
177+
requestScope.runInScope(() -> processFailure(failure, callback));
178+
}
179+
};
180+
181+
connector.apply(processedRequest, connectorCallback);
182+
} catch (final Throwable throwable) {
183+
processFailure(throwable, callback);
184+
}
185+
});
187186
}
188187

189188
@Override
@@ -228,12 +227,7 @@ private void processFailure(final Throwable failure, final ResponseCallback call
228227
}
229228

230229
private Future<?> submit(final ExecutorService executor, final Runnable task) {
231-
return executor.submit(new Runnable() {
232-
@Override
233-
public void run() {
234-
requestScope.runInScope(task);
235-
}
236-
});
230+
return executor.submit(() -> requestScope.runInScope(task));
237231
}
238232

239233
private ClientRequest addUserAgent(final ClientRequest clientRequest, final String connectorName) {
@@ -247,10 +241,10 @@ private ClientRequest addUserAgent(final ClientRequest clientRequest, final Stri
247241
} else if (!clientRequest.ignoreUserAgent()) {
248242
if (connectorName != null && !connectorName.isEmpty()) {
249243
headers.put(HttpHeaders.USER_AGENT,
250-
Arrays.asList(String.format("Jersey/%s (%s)", Version.getVersion(), connectorName)));
244+
Collections.singletonList(String.format("Jersey/%s (%s)", Version.getVersion(), connectorName)));
251245
} else {
252246
headers.put(HttpHeaders.USER_AGENT,
253-
Arrays.asList(String.format("Jersey/%s", Version.getVersion())));
247+
Collections.singletonList(String.format("Jersey/%s", Version.getVersion())));
254248
}
255249
}
256250

0 commit comments

Comments
 (0)