blob: 4f469ad9d85f0906440893dde53be1ea7216c2c1 [file] [log] [blame]
/*******************************************************************************
* 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.ext.loader;
import javax.security.auth.callback.CallbackHandler;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.security.auth.AuthPlugin;
import org.eclipse.equinox.internal.security.auth.nls.SecAuthMessages;
import org.eclipse.osgi.util.NLS;
// XXX rename: CallbackHandlerLoader
public class ExtCallbackHandlerLoader {
final private static String POINT_HANDLER = AuthPlugin.PI_AUTH + "." + "callbackHandler"; //$NON-NLS-1$ //$NON-NLS-2$
final private static String ELEM_HANDLER = "callbackHandler"; //$NON-NLS-1$
final private static String ATTR_HANDLER_CLASS = "class"; //$NON-NLS-1$
final private static String POINT_MAPPING = AuthPlugin.PI_AUTH + "." + "callbackHandlerMapping"; //$NON-NLS-1$ //$NON-NLS-2$
final private static String ELEM_MAPPING = "callbackHandlerMapping"; //$NON-NLS-1$
final private static String ATTR_MAPPING_CONFIGNAME = "configName";//$NON-NLS-1$
final private static String ATTR_MAPPING_CALLBACKID = "callbackHandlerId"; //$NON-NLS-1$
public CallbackHandler loadCallbackHandler(String configName) {
IExtensionRegistry registry = RegistryFactory.getRegistry();
// First, map config name -> callback handler ID
IExtensionPoint point = registry.getExtensionPoint(POINT_MAPPING);
IExtension[] extenders = point.getExtensions();
String extensionId = null;
for (int i = 0; i < extenders.length; i++) {
IConfigurationElement[] confEelements = extenders[i].getConfigurationElements();
if (confEelements.length != 1)
continue; // TBD error message?
extensionId = loadMappingEntry(confEelements[0], configName);
if (extensionId != null)
break;
}
if (extensionId == null)
return null;
// Next, load class specified by the callback handler ID
IExtensionPoint pointCallbackHandler = registry.getExtensionPoint(POINT_HANDLER);
IExtension extension = pointCallbackHandler.getExtension(extensionId);
if (extension == null)
return null;
IConfigurationElement[] elements = extension.getConfigurationElements();
if (elements.length != 1)
return null; // TBD error message?
return loadHandlerClass(elements[0]);
}
private String loadMappingEntry(IConfigurationElement element, String configName) {
if (!expectedElement(element, ELEM_MAPPING))
return null;
if (configName.equals(element.getAttribute(ATTR_MAPPING_CONFIGNAME)))
return element.getAttribute(ATTR_MAPPING_CALLBACKID);
return null;
}
private CallbackHandler loadHandlerClass(IConfigurationElement element) {
if (!expectedElement(element, ELEM_HANDLER))
return null;
try {
return (CallbackHandler) element.createExecutableExtension(ATTR_HANDLER_CLASS);
} catch (CoreException e) {
String message = NLS.bind(SecAuthMessages.instantiationFailed1, element.getAttribute(ATTR_HANDLER_CLASS));
AuthPlugin.getDefault().logError(message, e);
return null;
}
}
private boolean expectedElement(IConfigurationElement element, String expectedName) {
if (expectedName.equals(element.getName()))
return true;
String supplier = element.getContributor().getName();
String message = NLS.bind(SecAuthMessages.unexpectedConfigElement, element.getName(), supplier);
AuthPlugin.getDefault().logError(message, null);
return false;
}
}