| /******************************************************************************* |
| * Copyright (c) 2005, 2008 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.equinox.internal.security.auth; |
| |
| import java.util.Hashtable; |
| import javax.security.auth.login.AppConfigurationEntry; |
| import javax.security.auth.login.Configuration; |
| import org.eclipse.equinox.internal.security.auth.nls.SecAuthMessages; |
| import org.eclipse.osgi.util.NLS; |
| |
| public class ConfigurationFederator extends Configuration { |
| |
| // TODO this usage needs to be changed. We should retrieve federatedConfigs |
| // from the "ConfigurationFactory" every time we are asked; the "ConfigurationFactory" |
| // shoudl keep a cache that corresponds to what's in the registry and update it on registry |
| // events |
| private Configuration[] federatedConfigs = null; |
| |
| private Hashtable configCache = new Hashtable(5); |
| private Hashtable configToProviderMap = new Hashtable(5); |
| |
| final private Configuration defaultConfiguration; |
| |
| public ConfigurationFederator(Configuration defaultConfiguration) { |
| this.defaultConfiguration = defaultConfiguration; |
| } |
| |
| public synchronized AppConfigurationEntry[] getAppConfigurationEntry(String name) { |
| AppConfigurationEntry[] returnValue = (AppConfigurationEntry[]) configCache.get(name); |
| if (returnValue != null) |
| return returnValue; |
| |
| // Note: adding default config provider last; extension-point based configs are queried first |
| Configuration[] configs = getFederatedConfigs(); |
| Configuration[] allConfigs = configs; |
| if (defaultConfiguration != null) { |
| allConfigs = new Configuration[configs.length + 1]; |
| System.arraycopy(configs, 0, allConfigs, 0, configs.length); |
| allConfigs[configs.length] = defaultConfiguration; |
| } |
| for (int i = 0; i < allConfigs.length; i++) { |
| boolean found = false; |
| AppConfigurationEntry[] config = allConfigs[i].getAppConfigurationEntry(name); |
| if (config == null) |
| continue; |
| String cachedProviderName = (String) configToProviderMap.get(name); |
| if (cachedProviderName != null && !cachedProviderName.equals(allConfigs[i].getClass().getName())) { |
| String message = NLS.bind(SecAuthMessages.duplicateJaasConfig1, name, cachedProviderName); |
| AuthPlugin.getDefault().logError(message, null); |
| } else { |
| if (found) { |
| String message = NLS.bind(SecAuthMessages.duplicateJaasConfig2, name, cachedProviderName); |
| AuthPlugin.getDefault().logError(message, null); |
| } else if ((config != null) && (config.length != 0)) { |
| returnValue = config; |
| configToProviderMap.put(name, allConfigs[i].getClass().getName()); |
| configCache.put(name, returnValue); |
| found = true; |
| } |
| } |
| } |
| |
| if (returnValue == null || returnValue.length == 0) { |
| String message = NLS.bind(SecAuthMessages.nonExistantJaasConfig, name); |
| AuthPlugin.getDefault().logError(message, null); |
| } |
| return returnValue; |
| } |
| |
| public synchronized void refresh() { |
| for (int i = 0; i < federatedConfigs.length; i++) |
| federatedConfigs[i].refresh(); |
| if (defaultConfiguration != null) |
| defaultConfiguration.refresh(); |
| |
| configCache.clear(); |
| configToProviderMap.clear(); |
| } |
| |
| private Configuration[] getFederatedConfigs() { |
| if (federatedConfigs == null) |
| federatedConfigs = ConfigurationFactory.getInstance().getConfigurations(); |
| return federatedConfigs; |
| } |
| } |