blob: f982a168e41569293c1dc57dec5b111c836f91d0 [file] [log] [blame]
/*
* Copyright (c) 2013, 2019 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2018 Payara Foundation and/or its affiliates.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package org.glassfish.jersey.server;
import java.util.Arrays;
import java.util.List;
import javax.ws.rs.RuntimeType;
import org.glassfish.jersey.internal.AutoDiscoverableConfigurator;
import org.glassfish.jersey.internal.BootstrapConfigurator;
import org.glassfish.jersey.internal.ContextResolverFactory;
import org.glassfish.jersey.internal.ExceptionMapperFactory;
import org.glassfish.jersey.internal.inject.AbstractBinder;
import org.glassfish.jersey.internal.inject.Binder;
import org.glassfish.jersey.internal.inject.InjectionManager;
import org.glassfish.jersey.internal.inject.Injections;
import org.glassfish.jersey.message.internal.MessageBodyFactory;
import org.glassfish.jersey.message.internal.MessagingBinders;
import org.glassfish.jersey.model.internal.ManagedObjectsFinalizer;
import org.glassfish.jersey.process.internal.RequestScope;
import org.glassfish.jersey.internal.inject.ParamConverterConfigurator;
import org.glassfish.jersey.server.internal.inject.ParamExtractorConfigurator;
import org.glassfish.jersey.server.internal.inject.ValueParamProviderConfigurator;
import org.glassfish.jersey.server.internal.process.RequestProcessingConfigurator;
import org.glassfish.jersey.server.model.internal.ResourceMethodInvokerConfigurator;
/**
* Utility class to create initialized server-side injection manager.
*
* @author Marek Potociar
*/
public final class TestInjectionManagerFactory {
private static Binder EMPTY_BINDER = new AbstractBinder() {
@Override
protected void configure() {
}
};
private TestInjectionManagerFactory() {
// prevents instantiation
}
/**
* Create new initialized server injection manager.
*
* @return new initialized server injection manager.
*/
public static BootstrapResult createInjectionManager() {
return createInjectionManager(new ResourceConfig(), EMPTY_BINDER);
}
/**
* Create new initialized server injection manager.
*
* @param runtimeConfig runtime config with test's components.
* @return new initialized server injection manager.
*/
public static BootstrapResult createInjectionManager(ResourceConfig runtimeConfig) {
return createInjectionManager(runtimeConfig, EMPTY_BINDER);
}
/**
* Create new initialized server injection manager.
*
* @param runtimeConfig runtime config with test's components.
* @param customBinder binder which is immediately registered.
* @return new initialized server injection manager.
*/
public static BootstrapResult createInjectionManager(ResourceConfig runtimeConfig, Binder customBinder) {
InjectionManager injectionManager = Injections.createInjectionManager();
injectionManager.register(new ServerBinder());
injectionManager.register(new MessagingBinders.MessageBodyProviders(runtimeConfig.getProperties(), RuntimeType.SERVER));
injectionManager.register(customBinder);
ServerBootstrapBag bootstrapBag = new ServerBootstrapBag();
ManagedObjectsFinalizer managedObjectsFinalizer = new ManagedObjectsFinalizer(injectionManager);
bootstrapBag.setManagedObjectsFinalizer(managedObjectsFinalizer);
List<BootstrapConfigurator> bootstrapConfigurators = Arrays.asList(
new RequestProcessingConfigurator(),
new RequestScope.RequestScopeConfigurator(),
new ParamConverterConfigurator(),
new ParamExtractorConfigurator(),
new ValueParamProviderConfigurator(),
new JerseyResourceContextConfigurator(),
new ComponentProviderConfigurator(),
new TestConfigConfigurator(runtimeConfig),
new ContextResolverFactory.ContextResolversConfigurator(),
new MessageBodyFactory.MessageBodyWorkersConfigurator(),
new ExceptionMapperFactory.ExceptionMappersConfigurator(),
new ResourceMethodInvokerConfigurator(),
new ProcessingProvidersConfigurator(),
new ContainerProviderConfigurator(RuntimeType.SERVER),
new AutoDiscoverableConfigurator(RuntimeType.SERVER),
new ResourceBagConfigurator(),
new ExternalRequestScopeConfigurator(),
new ModelProcessorConfigurator(),
new ResourceModelConfigurator(),
new ServerExecutorProvidersConfigurator());
bootstrapConfigurators.forEach(configurator -> configurator.init(injectionManager, bootstrapBag));
// Configure binders and features.
bootstrapBag.getRuntimeConfig().configureMetaProviders(injectionManager, bootstrapBag.getManagedObjectsFinalizer());
injectionManager.completeRegistration();
bootstrapConfigurators.forEach(configurator -> configurator.postInit(injectionManager, bootstrapBag));
return new BootstrapResult(injectionManager, bootstrapBag);
}
public static class BootstrapResult {
public InjectionManager injectionManager;
public ServerBootstrapBag bootstrapBag;
BootstrapResult(InjectionManager injectionManager, ServerBootstrapBag bootstrapBag) {
this.injectionManager = injectionManager;
this.bootstrapBag = bootstrapBag;
}
}
}