9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington/*
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * The contents of this file are subject to the terms of the Common Development and
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * Distribution License (the License). You may not use this file except in compliance with the
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * License.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * specific language governing permission and limitations under the License.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * When distributing Covered Software, include this CDDL Header Notice in each file and include
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * Header, with the fields enclosed by brackets [] replaced by your own identifying
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * information: "Portions copyright [year] [name of copyright owner]".
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * Copyright 2015 ForgeRock AS.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington */
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunningtonpackage com.sun.identity.setup;
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunningtonimport javax.servlet.FilterConfig;
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunningtonimport javax.servlet.ServletContextEvent;
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunningtonimport com.google.inject.Injector;
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunningtonimport com.google.inject.Key;
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington/**
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * <p>A thread-safe singleton holding the system startup Guice Injector instance that system
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * startup and bootstrapping classes can call to get to use dependency injection during the system
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * startup process.</p>
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * The SystemStartupInjectorHolder should ONLY be used from
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * {@link AMSetupFilter#init(FilterConfig)} and NOWHERE else!
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * @see com.google.inject.Injector
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * @since 13.0.0
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington */
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunningtonfinal class SystemStartupInjectorHolder {
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington private static SystemStartupInjectorHolder instance;
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington private final Injector injector;
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington private SystemStartupInjectorHolder(Injector injector) {
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington this.injector = injector;
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington }
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington /**
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * <p>Initialises the system startup injector holder with a specific Guice injector
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * instance.</p>
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * This should ONLY be called from the
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * {@link SystemStartupInjectorListener#contextInitialized(ServletContextEvent)} and
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * {@link AMSetupFilter} tests and NOWHERE else!
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * @param injector The system startup injector.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington */
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington static synchronized void initialise(Injector injector) {
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington if (instance == null) {
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington instance = new SystemStartupInjectorHolder(injector);
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington }
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington }
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington /**
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * <p>Retrieves the system startup Guice injector.</p>
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * This should ONLY be called from {@link AMSetupFilter#init(FilterConfig)} and NOWHERE else!
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * @return The configured Guice injector.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington */
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington static SystemStartupInjectorHolder getInstance() {
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington if (instance == null) {
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington throw new IllegalStateException("SystemStartupInjectorHolder has not been initialised!");
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington }
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington return instance;
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington }
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington /**
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * <p>Uses the Guice injector to return the appropriate instance for the given injection
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * type.</p>
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * Avoid using this method, in favour of having Guice inject your dependencies ahead of time.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * @param type The class to get an instance of.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * @param <T> The type of class to get.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * @return A non-null instance of the class.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington */
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington <T> T getInstance(Class<T> type) {
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington return injector.getInstance(type);
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington }
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington /**
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * <p>Uses the Guice injector to return the appropriate instance for the given injection
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * key.</p>
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * Avoid using this method, in favour of having Guice inject your dependencies ahead of time.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington *
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * @param key The key that defines the class to get.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * @param <T> The type of class defined by the key.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington * @return A non-null instance of the class defined by the key.
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington */
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington <T> T getInstance(Key<T> key) {
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington return injector.getInstance(key);
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington }
9446b3153033ef93a59c5288074e6c688e7fdf5dPhill Cunnington}