/** * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2009 Sun Microsystems Inc. All Rights Reserved * * 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 * https://opensso.dev.java.net/public/CDDLv1.0.html or * opensso/legal/CDDLv1.0.txt * See the License for the specific language governing * permission and limitations under the License. * * When distributing Covered Code, include this CDDL * Header Notice in each file and include the License file * at opensso/legal/CDDLv1.0.txt. * If applicable, addReferral the following below the CDDL Header, * with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * * $Id: CoreTokenConfigService.java,v 1.1 2009/11/19 00:07:40 qcheng Exp $ */ package com.sun.identity.coretoken.service; import com.iplanet.sso.SSOException; import com.iplanet.sso.SSOToken; import com.sun.identity.coretoken.CoreTokenConstants; import com.sun.identity.coretoken.CoreTokenUtils; import com.sun.identity.security.AdminTokenAction; import com.sun.identity.sm.ServiceListener; import com.sun.identity.sm.SMSException; import com.sun.identity.sm.ServiceConfig; import com.sun.identity.sm.ServiceConfigManager; import java.security.AccessController; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * This OpenSSOCoreTokenStore implements the core token store * using SM store. */ public class CoreTokenConfigService implements ServiceListener { private static final String IMPL_CLASS_ATTR = "tokenStoreImplClass"; static final String SEARCHABLE_ATTR = "searchableAttributes"; static final String CLEANUP_INTERVAL = "tokenCleanupInterval"; static final String TYPES_WITHOUT_ETAG_ENFORCE = "tokenTypesWithoutEtagEnforcement"; // default cleanup interval in mini-seconds static final long DEFAULT_CLEANUP_INTERVAL = 180000; public static String implClassName = null; // searchable attributes set public static Set searchableAttrs = new HashSet(); public static long cleanupInt = 180000; public static Set noETagEnfTypes = new HashSet(); // TODO : implement SMS listener for changes static { try { CoreTokenConfigService service = new CoreTokenConfigService(); service.initServiceConfig(); SSOToken adminToken = (SSOToken) AccessController .doPrivileged(AdminTokenAction.getInstance()); ServiceConfigManager serviceConfigManager = new ServiceConfigManager(adminToken, CoreTokenConstants.CORE_TOKEN_CONFIG_SERVICE_NAME, "1.0"); String notificationId = serviceConfigManager.addListener(service); if (CoreTokenUtils.debug.messageEnabled()) { CoreTokenUtils.debug.message("CoreTokenConfigService.static " + " add service notification " + notificationId); } } catch (SMSException ex) { CoreTokenUtils.debug.error("CoreTokenConfigService.static", ex); } catch (SSOException ex) { CoreTokenUtils.debug.error("CoreTokenConfigService.static", ex); } } public void CoreTokenConfigService() { } private synchronized void initServiceConfig() { try { SSOToken dsameUserToken = (SSOToken) AccessController.doPrivileged( AdminTokenAction.getInstance()); ServiceConfigManager mgr = new ServiceConfigManager( CoreTokenConstants.CORE_TOKEN_CONFIG_SERVICE_NAME, dsameUserToken); ServiceConfig globalConf = mgr.getGlobalConfig(null); if (globalConf != null) { Map> map = globalConf.getAttributes(); if (map != null) { Set set = map.get(IMPL_CLASS_ATTR); if ((set != null) && !set.isEmpty()) { implClassName = set.iterator().next(); } set = map.get(SEARCHABLE_ATTR); Set tmpSet = new HashSet(); if ((set != null) && !set.isEmpty()) { Iterator it = set.iterator(); while (it.hasNext()) { tmpSet.add(it.next().toLowerCase()); } } searchableAttrs = tmpSet; set = map.get(CLEANUP_INTERVAL); if ((set != null) && !set.isEmpty()) { String tmp = set.iterator().next(); try { cleanupInt = Integer.parseInt(tmp) * 1000; } catch (NumberFormatException ne) { CoreTokenUtils.debug.error("CoreTokenConfigService" + ".init. invalid interval : " + tmp, ne); cleanupInt = DEFAULT_CLEANUP_INTERVAL; } } set = map.get(TYPES_WITHOUT_ETAG_ENFORCE); tmpSet = new HashSet(); if ((set != null) && !set.isEmpty()) { Iterator it = set.iterator(); while (it.hasNext()) { tmpSet.add(it.next().toLowerCase()); } } noETagEnfTypes = tmpSet; } } if (CoreTokenUtils.debug.messageEnabled()) { CoreTokenUtils.debug.message("CoreTokenConfigServcie.init: " + "searchable Attrs=" + searchableAttrs + "; token store impl class=" + implClassName + "; cleanup interval=" + cleanupInt + "; token types without ETag enforcement=" + noETagEnfTypes); } } catch (SMSException ex) { CoreTokenUtils.debug.error("CoreTokenConfigService.init", ex); } catch (SSOException ex) { CoreTokenUtils.debug.error("CoreTokenConfigService.init", ex); } } public void schemaChanged(String serviceName, String version) { if (CoreTokenUtils.debug.messageEnabled()) { CoreTokenUtils.debug.message("CoreTokenConfigService.schema" + "Change. serviceName=" + serviceName + ", version="); } // ignore } public void globalConfigChanged(String serviceName, String version, String groupName, String serviceComponent, int type) { if (CoreTokenUtils.debug.messageEnabled()) { CoreTokenUtils.debug.message("CoreTokenConfigService.globalConfig" + "Change. serviceName=" + serviceName + ", version=" + version + ", groupName=" + groupName + ", serviceComponent=" + serviceComponent + ", type=" + type); } initServiceConfig(); } public void organizationConfigChanged(String serviceName, String version, String orgName, String groupName, String serviceComponent, int type) { if (CoreTokenUtils.debug.messageEnabled()) { CoreTokenUtils.debug.message("CoreTokenConfigService.orgConfig" + "Change. serviceName=" + serviceName + ", version=" + version + ", groupName=" + groupName + ", serviceComponent=" + serviceComponent + ", type=" + type); } // ignore } }