CoreGuiceModule.java revision b334b83b7ac2d9a8c60d935cad0365506f13333b
/*
* The contents of this file are subject to the terms of the Common Development and
* Distribution License (the License). You may not use this file except in compliance with the
* License.
*
* You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
* specific language governing permission and limitations under the License.
*
* When distributing Covered Software, include this CDDL Header Notice in each file and include
* the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
* Header, with the fields enclosed by brackets [] replaced by your own identifying
* information: "Portions copyright [year] [name of copyright owner]".
*
* Copyright 2013 ForgeRock Inc.
*/
package org.forgerock.openam.core.guice;
import com.google.inject.AbstractModule;
import com.google.inject.Provider;
import com.google.inject.TypeLiteral;
import com.iplanet.dpro.session.service.CoreTokenServiceFactory;
import com.iplanet.dpro.session.service.SessionService;
import com.iplanet.services.ldap.DSConfigMgr;
import com.iplanet.services.ldap.LDAPServiceException;
import com.iplanet.sso.SSOToken;
import com.sun.identity.common.ShutdownListener;
import com.sun.identity.common.ShutdownManager;
import com.sun.identity.security.AdminTokenAction;
import com.sun.identity.sm.DNMapper;
import com.sun.identity.sm.ServiceManagementDAO;
import com.sun.identity.sm.ServiceManagementDAOWrapper;
import com.sun.identity.sm.ldap.CTSPersistentStore;
import com.sun.identity.sm.ldap.CoreTokenConfig;
import com.sun.identity.sm.ldap.adapters.OAuthAdapter;
import com.sun.identity.sm.ldap.adapters.TokenAdapter;
import org.forgerock.json.fluent.JsonValue;
import org.forgerock.openam.entitlement.indextree.IndexChangeHandler;
import org.forgerock.openam.entitlement.indextree.IndexChangeManager;
import org.forgerock.openam.entitlement.indextree.IndexChangeManagerImpl;
import org.forgerock.openam.entitlement.indextree.IndexChangeMonitor;
import org.forgerock.openam.entitlement.indextree.IndexChangeMonitorImpl;
import org.forgerock.openam.entitlement.indextree.IndexTreeService;
import org.forgerock.openam.entitlement.indextree.IndexTreeServiceImpl;
import org.forgerock.openam.entitlement.indextree.events.IndexChangeObservable;
import org.forgerock.openam.guice.AMGuiceModule;
import org.forgerock.openam.sm.DataLayerConnectionFactory;
import org.forgerock.opendj.ldap.SearchResultHandler;
import javax.inject.Singleton;
import java.security.PrivilegedAction;
/**
* Guice Module for configuring bindings for the OpenAM Core classes.
*
* @author apforrest
* @author robert.wapshott@forgerock.com
*/
@AMGuiceModule
public class CoreGuiceModule extends AbstractModule {
@Override
protected void configure() {
bind(new AdminTokenType()).toProvider(new AdminTokenProvider()).in(Singleton.class);
bind(ServiceManagementDAO.class).to(ServiceManagementDAOWrapper.class).in(Singleton.class);
bind(DNWrapper.class).in(Singleton.class);
bind(IndexChangeObservable.class).in(Singleton.class);
bind(ShutdownManagerWrapper.class).in(Singleton.class);
bind(SearchResultHandler.class).to(IndexChangeHandler.class).in(Singleton.class);
bind(IndexChangeManager.class).to(IndexChangeManagerImpl.class).in(Singleton.class);
bind(IndexChangeMonitor.class).to(IndexChangeMonitorImpl.class).in(Singleton.class);
bind(IndexTreeService.class).to(IndexTreeServiceImpl.class).in(Singleton.class);
bind(new TypeLiteral<TokenAdapter<JsonValue>>(){}).to(OAuthAdapter.class);
/**
* Configuration data for Data Layer LDAP connections.
* Using a provider to defer initialisation of the factory until
* it is needed.
*/
bind(DataLayerConnectionFactory.class).in(Singleton.class);
bind(DSConfigMgr.class).toProvider(new Provider<DSConfigMgr>() {
@Override
public DSConfigMgr get() {
try {
return DSConfigMgr.getDSConfigMgr();
} catch (LDAPServiceException e) {
throw new IllegalStateException(e);
}
}
}).in(Singleton.class);
/**
* Core Token Service bindings
* CTSPersistentStore using provider to delay initialisation.
*/
bind(CoreTokenConfig.class).in(Singleton.class);
bind(CTSPersistentStore.class).toProvider(new Provider<CTSPersistentStore>() {
public CTSPersistentStore get() {
return CoreTokenServiceFactory.getInstance();
}
});
/**
* Session related dependencies.
*/
bind(SessionService.class).toProvider(new Provider<SessionService>() {
public SessionService get() {
return SessionService.getSessionService();
}
}).in(Singleton.class);
}
// Implementation exists to capture the generic type of the PrivilegedAction.
private static class AdminTokenType extends TypeLiteral<PrivilegedAction<SSOToken>> {
}
// Simple provider implementation to return the static instance of AdminTokenAction.
private static class AdminTokenProvider implements Provider<PrivilegedAction<SSOToken>> {
@Override
public PrivilegedAction<SSOToken> get() {
// Provider used over bind(..).getInstance(..) to enforce a lazy loading approach.
return AdminTokenAction.getInstance();
}
}
/**
* Wrapper class to remove coupling to DNMapper static methods.
* <p/>
* Until DNMapper is refactored, this class can be used to assist with DI.
*/
public static class DNWrapper {
/**
* @see com.sun.identity.sm.DNMapper#orgNameToDN(String)
*/
public String orgNameToDN(String orgName) {
return DNMapper.orgNameToDN(orgName);
}
/**
* @see DNMapper#orgNameToRealmName(String)
*/
public String orgNameToRealmName(String orgName) {
return DNMapper.orgNameToRealmName(orgName);
}
}
/**
* Wrap class to remove coupling to ShutdownManager static methods.
* <p/>
* Until ShutdownManager is refactored, this class can be used to assist with DI.
*/
public static class ShutdownManagerWrapper {
/**
* @see com.sun.identity.common.ShutdownManager#addShutdownListener(com.sun.identity.common.ShutdownListener)
*/
public void addShutdownListener(ShutdownListener listener) {
ShutdownManager shutdownManager = ShutdownManager.getInstance();
try {
if (shutdownManager.acquireValidLock()) {
// Add the listener.
shutdownManager.addShutdownListener(listener);
}
} finally {
shutdownManager.releaseLockAndNotify();
}
}
}
}