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

Commit

Permalink
Merge changes I6c8ed84c,I599ba9cf
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
pavelbucek authored and Gerrit Code Review committed May 18, 2017
2 parents b729302 + 65aa8f1 commit 5ebaadf
Show file tree
Hide file tree
Showing 17 changed files with 544 additions and 267 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@
import javax.ws.rs.RuntimeType;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Configuration;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.ext.MessageBodyReader;
Expand All @@ -85,7 +84,6 @@
import org.glassfish.jersey.internal.inject.Injections;
import org.glassfish.jersey.internal.inject.InstanceBinding;
import org.glassfish.jersey.internal.inject.Providers;
import org.glassfish.jersey.internal.util.collection.Ref;
import org.glassfish.jersey.message.MessageBodyWorkers;
import org.glassfish.jersey.message.internal.MessageBodyFactory;
import org.glassfish.jersey.message.internal.MessagingBinders;
Expand All @@ -108,7 +106,9 @@
import org.glassfish.jersey.server.internal.monitoring.CompositeApplicationEventListener;
import org.glassfish.jersey.server.internal.monitoring.MonitoringContainerListener;
import org.glassfish.jersey.server.internal.process.ReferencesInitializer;
import org.glassfish.jersey.server.internal.process.RequestProcessingConfigurator;
import org.glassfish.jersey.server.internal.process.RequestProcessingContext;
import org.glassfish.jersey.server.internal.process.RequestProcessingContextReference;
import org.glassfish.jersey.server.internal.routing.Routing;
import org.glassfish.jersey.server.model.ComponentModelValidator;
import org.glassfish.jersey.server.model.ModelProcessor;
Expand Down Expand Up @@ -292,6 +292,7 @@ private void initialize(ApplicationConfigurator applicationConfigurator, Injecti
ServerBootstrapBag bootstrapBag = new ServerBootstrapBag();
bootstrapBag.setManagedObjectsFinalizer(managedObjectsFinalizer);
List<BootstrapConfigurator> bootstrapConfigurators = Arrays.asList(
new RequestProcessingConfigurator(),
new RequestScope.RequestScopeConfigurator(),
new ParamConverterConfigurator(),
new ParamExtractorConfigurator(),
Expand Down Expand Up @@ -425,9 +426,8 @@ private ServerRuntime initialize(InjectionManager injectionManager, List<Bootstr
final ContainerFilteringStage resourceFilteringStage =
new ContainerFilteringStage(processingProviders.getGlobalRequestFilters(), null);

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

final Stage<RequestProcessingContext> rootStage = Stages
.chain(referencesInitializer)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@
import org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor;
import org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor;
import org.glassfish.jersey.server.internal.monitoring.MonitoringContainerListener;
import org.glassfish.jersey.server.internal.process.ServerProcessingBinder;

/**
* Server injection binder.
Expand All @@ -61,8 +60,7 @@ class ServerBinder extends AbstractBinder {

@Override
protected void configure() {
install(new ServerProcessingBinder(),
new MappableExceptionWrapperInterceptor.Binder(),
install(new MappableExceptionWrapperInterceptor.Binder(),
new MonitoringContainerListener.Binder());

//ChunkedResponseWriter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,11 @@

import org.glassfish.jersey.internal.BootstrapBag;
import org.glassfish.jersey.internal.util.collection.LazyValue;
import org.glassfish.jersey.internal.util.collection.Ref;
import org.glassfish.jersey.server.internal.JerseyResourceContext;
import org.glassfish.jersey.server.internal.ProcessingProviders;
import org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractorProvider;
import org.glassfish.jersey.server.internal.process.RequestProcessingContext;
import org.glassfish.jersey.server.model.ModelProcessor;
import org.glassfish.jersey.server.model.ResourceMethodInvoker;
import org.glassfish.jersey.server.model.ResourceModel;
Expand Down Expand Up @@ -171,6 +173,7 @@ public void setResourceMethodInvokerBuilder(ResourceMethodInvoker.Builder resour
}

public ResourceModel getResourceModel() {
requireNonNull(resourceModel, ResourceModel.class);
return resourceModel;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -854,6 +854,11 @@ public void run() {
});
}

@Override
public void invokeManaged(Runnable runnable) {
responder.runtime.managedAsyncExecutor.get().submit(runnable);
}

@Override
public boolean suspend() {
synchronized (stateLock) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;

import javax.ws.rs.BeanParam;
import javax.ws.rs.CookieParam;
Expand All @@ -72,6 +72,7 @@
import org.glassfish.jersey.server.ServerBootstrapBag;
import org.glassfish.jersey.server.Uri;
import org.glassfish.jersey.server.internal.process.AsyncContext;
import org.glassfish.jersey.server.internal.process.RequestProcessingContextReference;
import org.glassfish.jersey.server.spi.internal.ValueParamProvider;

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

Provider<AsyncContext> asyncContextProvider = () -> injectionManager.getInstance(AsyncContext.class);

Function<Class<? extends Configuration>, Configuration> clientConfigProvider =
clientConfigClass -> Injections.getOrCreate(injectionManager, clientConfigClass);

LazyValue<Configuration> lazyConfiguration =
Values.lazy((Value<Configuration>) () -> injectionManager.getInstance(Configuration.class));
// Provide request scoped AsyncContext without the proxy.
Provider<AsyncContext> asyncContextProvider = () -> {
RequestProcessingContextReference reference = injectionManager.getInstance(RequestProcessingContextReference.class);
return reference.get().asyncContext();
};

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

Supplier<Configuration> configuration = serverBag::getConfiguration;
Provider<MultivaluedParameterExtractorProvider> paramExtractor = serverBag::getMultivaluedParameterExtractorProvider;

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

WebTargetValueParamProvider webTargetProvider =
new WebTargetValueParamProvider(lazyConfiguration, clientConfigProvider);
WebTargetValueParamProvider webTargetProvider = new WebTargetValueParamProvider(configuration,
clientConfigClass -> Injections.getOrCreate(injectionManager, clientConfigClass));
suppliers.add(webTargetProvider);

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

Provider<ContainerRequest> request = () -> injectionManager.getInstance(ContainerRequest.class);
// Provide request scoped ContainerRequest without the proxy.
Provider<ContainerRequest> request = () -> {
RequestProcessingContextReference reference = injectionManager.getInstance(RequestProcessingContextReference.class);
return reference.get().request();
};

registerResolver(injectionManager, asyncProvider, Suspended.class, request);
registerResolver(injectionManager, cookieProvider, CookieParam.class, request);
registerResolver(injectionManager, formProvider, FormParam.class, request);
Expand All @@ -163,7 +169,7 @@ public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
registerResolver(injectionManager, beanProvider, BeanParam.class, request);
}

private void registerResolver(InjectionManager im, ValueParamProvider vfp, Class<? extends Annotation> annotation,
private void registerResolver(InjectionManager im, ValueParamProvider vfp, Class<? extends Annotation> annotation,
Provider<ContainerRequest> request) {
im.register(Bindings.injectionResolver(new ParamInjectionResolver<>(vfp, annotation, request)));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

import javax.ws.rs.ProcessingException;
Expand All @@ -63,7 +64,6 @@
import org.glassfish.jersey.internal.util.Producer;
import org.glassfish.jersey.internal.util.PropertiesHelper;
import org.glassfish.jersey.internal.util.ReflectionHelper;
import org.glassfish.jersey.internal.util.collection.LazyValue;
import org.glassfish.jersey.internal.util.collection.Value;
import org.glassfish.jersey.internal.util.collection.Values;
import org.glassfish.jersey.server.ClientBinding;
Expand All @@ -82,7 +82,7 @@
final class WebTargetValueParamProvider extends AbstractValueParamProvider {

private final Function<Class<? extends Configuration>, Configuration> clientConfigProvider;
private final LazyValue<Configuration> serverConfig;
private final Supplier<Configuration> serverConfig;
private final ConcurrentMap<BindingModel, Value<ManagedClient>> managedClients;

private static class ManagedClient {
Expand Down Expand Up @@ -276,7 +276,7 @@ public WebTarget apply(ContainerRequest containerRequest) {
* @param serverConfig server-side serverConfig.
* @param clientConfigProvider function which get or create a new client serverConfig according to provided class.
*/
public WebTargetValueParamProvider(LazyValue<Configuration> serverConfig,
public WebTargetValueParamProvider(Supplier<Configuration> serverConfig,
Function<Class<? extends Configuration>, Configuration> clientConfigProvider) {
super(null, Parameter.Source.URI);
this.clientConfigProvider = clientConfigProvider;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2012-2014 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012-2017 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
Expand Down Expand Up @@ -97,4 +97,11 @@ public static enum State {
* @param producer response producer.
*/
public void invokeManaged(Producer<Response> producer);

/**
* Invoke the provided runnable in a Jersey-managed asynchronous thread.
*
* @param runnable to be invoked.
*/
public void invokeManaged(Runnable runnable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
import javax.inject.Provider;

import org.glassfish.jersey.internal.inject.InjectionManager;
import org.glassfish.jersey.internal.util.collection.Ref;
import org.glassfish.jersey.server.spi.RequestScopedInitializer;

/**
Expand All @@ -56,7 +55,7 @@
public final class ReferencesInitializer implements Function<RequestProcessingContext, RequestProcessingContext> {

private final InjectionManager injectionManager;
private final Provider<Ref<RequestProcessingContext>> processingContextRefProvider;
private final Provider<RequestProcessingContextReference> processingContextRefProvider;

/**
* Injection constructor.
Expand All @@ -65,7 +64,7 @@ public final class ReferencesInitializer implements Function<RequestProcessingCo
* @param processingContextRefProvider container request reference provider (request-scoped).
*/
public ReferencesInitializer(
InjectionManager injectionManager, Provider<Ref<RequestProcessingContext>> processingContextRefProvider) {
InjectionManager injectionManager, Provider<RequestProcessingContextReference> processingContextRefProvider) {
this.injectionManager = injectionManager;
this.processingContextRefProvider = processingContextRefProvider;
}
Expand Down
Loading

0 comments on commit 5ebaadf

Please sign in to comment.