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

Commit 5ebaadf

Browse files
pavelbucekGerrit Code Review
authored andcommitted
Merge changes I6c8ed84c,I599ba9cf
* changes: Support for returning CompletionStage from a resource method. Creates a reference wrapper of RequestProcessingContext that allows to get a request scoped instance internally without the proxy.
2 parents b729302 + 65aa8f1 commit 5ebaadf

17 files changed

+544
-267
lines changed

core-server/src/main/java/org/glassfish/jersey/server/ApplicationHandler.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@
6363
import javax.ws.rs.RuntimeType;
6464
import javax.ws.rs.core.Application;
6565
import javax.ws.rs.core.Configuration;
66-
import javax.ws.rs.core.GenericType;
6766
import javax.ws.rs.core.HttpHeaders;
6867
import javax.ws.rs.core.SecurityContext;
6968
import javax.ws.rs.ext.MessageBodyReader;
@@ -85,7 +84,6 @@
8584
import org.glassfish.jersey.internal.inject.Injections;
8685
import org.glassfish.jersey.internal.inject.InstanceBinding;
8786
import org.glassfish.jersey.internal.inject.Providers;
88-
import org.glassfish.jersey.internal.util.collection.Ref;
8987
import org.glassfish.jersey.message.MessageBodyWorkers;
9088
import org.glassfish.jersey.message.internal.MessageBodyFactory;
9189
import org.glassfish.jersey.message.internal.MessagingBinders;
@@ -108,7 +106,9 @@
108106
import org.glassfish.jersey.server.internal.monitoring.CompositeApplicationEventListener;
109107
import org.glassfish.jersey.server.internal.monitoring.MonitoringContainerListener;
110108
import org.glassfish.jersey.server.internal.process.ReferencesInitializer;
109+
import org.glassfish.jersey.server.internal.process.RequestProcessingConfigurator;
111110
import org.glassfish.jersey.server.internal.process.RequestProcessingContext;
111+
import org.glassfish.jersey.server.internal.process.RequestProcessingContextReference;
112112
import org.glassfish.jersey.server.internal.routing.Routing;
113113
import org.glassfish.jersey.server.model.ComponentModelValidator;
114114
import org.glassfish.jersey.server.model.ModelProcessor;
@@ -292,6 +292,7 @@ private void initialize(ApplicationConfigurator applicationConfigurator, Injecti
292292
ServerBootstrapBag bootstrapBag = new ServerBootstrapBag();
293293
bootstrapBag.setManagedObjectsFinalizer(managedObjectsFinalizer);
294294
List<BootstrapConfigurator> bootstrapConfigurators = Arrays.asList(
295+
new RequestProcessingConfigurator(),
295296
new RequestScope.RequestScopeConfigurator(),
296297
new ParamConverterConfigurator(),
297298
new ParamExtractorConfigurator(),
@@ -425,9 +426,8 @@ private ServerRuntime initialize(InjectionManager injectionManager, List<Bootstr
425426
final ContainerFilteringStage resourceFilteringStage =
426427
new ContainerFilteringStage(processingProviders.getGlobalRequestFilters(), null);
427428

428-
GenericType<Ref<RequestProcessingContext>> requestProcessingType = new GenericType<Ref<RequestProcessingContext>>() {};
429-
ReferencesInitializer referencesInitializer = new ReferencesInitializer(injectionManager,
430-
() -> injectionManager.getInstance(requestProcessingType.getType()));
429+
final ReferencesInitializer referencesInitializer = new ReferencesInitializer(injectionManager,
430+
() -> injectionManager.getInstance(RequestProcessingContextReference.class));
431431

432432
final Stage<RequestProcessingContext> rootStage = Stages
433433
.chain(referencesInitializer)

core-server/src/main/java/org/glassfish/jersey/server/ServerBinder.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor;
5050
import org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor;
5151
import org.glassfish.jersey.server.internal.monitoring.MonitoringContainerListener;
52-
import org.glassfish.jersey.server.internal.process.ServerProcessingBinder;
5352

5453
/**
5554
* Server injection binder.
@@ -61,8 +60,7 @@ class ServerBinder extends AbstractBinder {
6160

6261
@Override
6362
protected void configure() {
64-
install(new ServerProcessingBinder(),
65-
new MappableExceptionWrapperInterceptor.Binder(),
63+
install(new MappableExceptionWrapperInterceptor.Binder(),
6664
new MonitoringContainerListener.Binder());
6765

6866
//ChunkedResponseWriter

core-server/src/main/java/org/glassfish/jersey/server/ServerBootstrapBag.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,11 @@
4747

4848
import org.glassfish.jersey.internal.BootstrapBag;
4949
import org.glassfish.jersey.internal.util.collection.LazyValue;
50+
import org.glassfish.jersey.internal.util.collection.Ref;
5051
import org.glassfish.jersey.server.internal.JerseyResourceContext;
5152
import org.glassfish.jersey.server.internal.ProcessingProviders;
5253
import org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractorProvider;
54+
import org.glassfish.jersey.server.internal.process.RequestProcessingContext;
5355
import org.glassfish.jersey.server.model.ModelProcessor;
5456
import org.glassfish.jersey.server.model.ResourceMethodInvoker;
5557
import org.glassfish.jersey.server.model.ResourceModel;
@@ -171,6 +173,7 @@ public void setResourceMethodInvokerBuilder(ResourceMethodInvoker.Builder resour
171173
}
172174

173175
public ResourceModel getResourceModel() {
176+
requireNonNull(resourceModel, ResourceModel.class);
174177
return resourceModel;
175178
}
176179

core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,11 @@ public void run() {
854854
});
855855
}
856856

857+
@Override
858+
public void invokeManaged(Runnable runnable) {
859+
responder.runtime.managedAsyncExecutor.get().submit(runnable);
860+
}
861+
857862
@Override
858863
public boolean suspend() {
859864
synchronized (stateLock) {

core-server/src/main/java/org/glassfish/jersey/server/internal/inject/ValueParamProviderConfigurator.java

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
import java.util.Collection;
4646
import java.util.Collections;
4747
import java.util.List;
48-
import java.util.function.Function;
48+
import java.util.function.Supplier;
4949

5050
import javax.ws.rs.BeanParam;
5151
import javax.ws.rs.CookieParam;
@@ -72,6 +72,7 @@
7272
import org.glassfish.jersey.server.ServerBootstrapBag;
7373
import org.glassfish.jersey.server.Uri;
7474
import org.glassfish.jersey.server.internal.process.AsyncContext;
75+
import org.glassfish.jersey.server.internal.process.RequestProcessingContextReference;
7576
import org.glassfish.jersey.server.spi.internal.ValueParamProvider;
7677

7778
/**
@@ -85,17 +86,17 @@ public class ValueParamProviderConfigurator implements BootstrapConfigurator {
8586
public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
8687
ServerBootstrapBag serverBag = (ServerBootstrapBag) bootstrapBag;
8788

88-
Provider<AsyncContext> asyncContextProvider = () -> injectionManager.getInstance(AsyncContext.class);
89-
90-
Function<Class<? extends Configuration>, Configuration> clientConfigProvider =
91-
clientConfigClass -> Injections.getOrCreate(injectionManager, clientConfigClass);
92-
93-
LazyValue<Configuration> lazyConfiguration =
94-
Values.lazy((Value<Configuration>) () -> injectionManager.getInstance(Configuration.class));
89+
// Provide request scoped AsyncContext without the proxy.
90+
Provider<AsyncContext> asyncContextProvider = () -> {
91+
RequestProcessingContextReference reference = injectionManager.getInstance(RequestProcessingContextReference.class);
92+
return reference.get().asyncContext();
93+
};
9594

95+
// Provide ContextInjectionResolver that is implemented by Injection Provider.
9696
LazyValue<ContextInjectionResolver> lazyContextResolver =
9797
Values.lazy((Value<ContextInjectionResolver>) () -> injectionManager.getInstance(ContextInjectionResolver.class));
9898

99+
Supplier<Configuration> configuration = serverBag::getConfiguration;
99100
Provider<MultivaluedParameterExtractorProvider> paramExtractor = serverBag::getMultivaluedParameterExtractorProvider;
100101

101102
// Parameter injection value providers
@@ -128,8 +129,8 @@ public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
128129
BeanParamValueParamProvider beanProvider = new BeanParamValueParamProvider(paramExtractor, injectionManager);
129130
suppliers.add(beanProvider);
130131

131-
WebTargetValueParamProvider webTargetProvider =
132-
new WebTargetValueParamProvider(lazyConfiguration, clientConfigProvider);
132+
WebTargetValueParamProvider webTargetProvider = new WebTargetValueParamProvider(configuration,
133+
clientConfigClass -> Injections.getOrCreate(injectionManager, clientConfigClass));
133134
suppliers.add(webTargetProvider);
134135

135136
DelegatedInjectionValueParamProvider contextProvider =
@@ -151,7 +152,12 @@ public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
151152
injectionManager.register(Bindings.service(entityProvider).to(ValueParamProvider.class));
152153
injectionManager.register(Bindings.service(contextProvider).to(ValueParamProvider.class));
153154

154-
Provider<ContainerRequest> request = () -> injectionManager.getInstance(ContainerRequest.class);
155+
// Provide request scoped ContainerRequest without the proxy.
156+
Provider<ContainerRequest> request = () -> {
157+
RequestProcessingContextReference reference = injectionManager.getInstance(RequestProcessingContextReference.class);
158+
return reference.get().request();
159+
};
160+
155161
registerResolver(injectionManager, asyncProvider, Suspended.class, request);
156162
registerResolver(injectionManager, cookieProvider, CookieParam.class, request);
157163
registerResolver(injectionManager, formProvider, FormParam.class, request);
@@ -163,7 +169,7 @@ public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
163169
registerResolver(injectionManager, beanProvider, BeanParam.class, request);
164170
}
165171

166-
private void registerResolver(InjectionManager im, ValueParamProvider vfp, Class<? extends Annotation> annotation,
172+
private void registerResolver(InjectionManager im, ValueParamProvider vfp, Class<? extends Annotation> annotation,
167173
Provider<ContainerRequest> request) {
168174
im.register(Bindings.injectionResolver(new ParamInjectionResolver<>(vfp, annotation, request)));
169175
}

core-server/src/main/java/org/glassfish/jersey/server/internal/inject/WebTargetValueParamProvider.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import java.util.concurrent.ConcurrentHashMap;
5050
import java.util.concurrent.ConcurrentMap;
5151
import java.util.function.Function;
52+
import java.util.function.Supplier;
5253
import java.util.stream.Collectors;
5354

5455
import javax.ws.rs.ProcessingException;
@@ -63,7 +64,6 @@
6364
import org.glassfish.jersey.internal.util.Producer;
6465
import org.glassfish.jersey.internal.util.PropertiesHelper;
6566
import org.glassfish.jersey.internal.util.ReflectionHelper;
66-
import org.glassfish.jersey.internal.util.collection.LazyValue;
6767
import org.glassfish.jersey.internal.util.collection.Value;
6868
import org.glassfish.jersey.internal.util.collection.Values;
6969
import org.glassfish.jersey.server.ClientBinding;
@@ -82,7 +82,7 @@
8282
final class WebTargetValueParamProvider extends AbstractValueParamProvider {
8383

8484
private final Function<Class<? extends Configuration>, Configuration> clientConfigProvider;
85-
private final LazyValue<Configuration> serverConfig;
85+
private final Supplier<Configuration> serverConfig;
8686
private final ConcurrentMap<BindingModel, Value<ManagedClient>> managedClients;
8787

8888
private static class ManagedClient {
@@ -276,7 +276,7 @@ public WebTarget apply(ContainerRequest containerRequest) {
276276
* @param serverConfig server-side serverConfig.
277277
* @param clientConfigProvider function which get or create a new client serverConfig according to provided class.
278278
*/
279-
public WebTargetValueParamProvider(LazyValue<Configuration> serverConfig,
279+
public WebTargetValueParamProvider(Supplier<Configuration> serverConfig,
280280
Function<Class<? extends Configuration>, Configuration> clientConfigProvider) {
281281
super(null, Parameter.Source.URI);
282282
this.clientConfigProvider = clientConfigProvider;

core-server/src/main/java/org/glassfish/jersey/server/internal/process/AsyncContext.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
33
*
4-
* Copyright (c) 2012-2014 Oracle and/or its affiliates. All rights reserved.
4+
* Copyright (c) 2012-2017 Oracle and/or its affiliates. All rights reserved.
55
*
66
* The contents of this file are subject to the terms of either the GNU
77
* General Public License Version 2 only ("GPL") or the Common Development
@@ -97,4 +97,11 @@ public static enum State {
9797
* @param producer response producer.
9898
*/
9999
public void invokeManaged(Producer<Response> producer);
100+
101+
/**
102+
* Invoke the provided runnable in a Jersey-managed asynchronous thread.
103+
*
104+
* @param runnable to be invoked.
105+
*/
106+
public void invokeManaged(Runnable runnable);
100107
}

core-server/src/main/java/org/glassfish/jersey/server/internal/process/ReferencesInitializer.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
import javax.inject.Provider;
4646

4747
import org.glassfish.jersey.internal.inject.InjectionManager;
48-
import org.glassfish.jersey.internal.util.collection.Ref;
4948
import org.glassfish.jersey.server.spi.RequestScopedInitializer;
5049

5150
/**
@@ -56,7 +55,7 @@
5655
public final class ReferencesInitializer implements Function<RequestProcessingContext, RequestProcessingContext> {
5756

5857
private final InjectionManager injectionManager;
59-
private final Provider<Ref<RequestProcessingContext>> processingContextRefProvider;
58+
private final Provider<RequestProcessingContextReference> processingContextRefProvider;
6059

6160
/**
6261
* Injection constructor.
@@ -65,7 +64,7 @@ public final class ReferencesInitializer implements Function<RequestProcessingCo
6564
* @param processingContextRefProvider container request reference provider (request-scoped).
6665
*/
6766
public ReferencesInitializer(
68-
InjectionManager injectionManager, Provider<Ref<RequestProcessingContext>> processingContextRefProvider) {
67+
InjectionManager injectionManager, Provider<RequestProcessingContextReference> processingContextRefProvider) {
6968
this.injectionManager = injectionManager;
7069
this.processingContextRefProvider = processingContextRefProvider;
7170
}

0 commit comments

Comments
 (0)