/******************************************************************************* * Copyright (c) 2009 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 * Zend Technologies *******************************************************************************/ package org.eclipse.php.internal.debug.core.zend.debugger; import java.util.Dictionary; import java.util.Enumeration; import java.util.Hashtable; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.debug.core.ILaunch; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.php.debug.core.debugger.parameters.IDebugParametersInitializer; import org.eclipse.php.internal.debug.core.IPHPDebugConstants; import org.eclipse.php.internal.debug.core.PHPDebugPlugin; /** * @author michael */ public class DebugParametersInitializersRegistry { private static final String EXTENSION_POINT_NAME = "phpDebugParametersInitializers"; //$NON-NLS-1$ private static final String INITIALIZER_TAG = "initializer"; //$NON-NLS-1$ private static final String ID_ATTRIBUTE = "id"; //$NON-NLS-1$ private static final String LAUNCH_CONFIGURATION_TYPE_ATTRIBUTE = "launchConfigurationType"; //$NON-NLS-1$ private static final String CLASS_ATTRIBUTE = "class"; //$NON-NLS-1$ private static final String HANDLER_ATTRIBUTE = "handler"; //$NON-NLS-1$ private static final String MODE_ATTRIBUTE = "mode"; //$NON-NLS-1$ private static final String RUN = "run"; //$NON-NLS-1$ private static final String DEBUG = "debug"; //$NON-NLS-1$ private static final String PROFILE = "profile"; //$NON-NLS-1$ /** Debug parameters initializers stored by ID */ private Dictionary runInitializers = new Hashtable(); private Dictionary debugInitializers = new Hashtable(); private Dictionary profileInitializers = new Hashtable(); /** Instance of this registry */ private static DebugParametersInitializersRegistry instance = null; private DebugParametersInitializersRegistry() { IExtensionRegistry registry = Platform.getExtensionRegistry(); IConfigurationElement[] elements = registry.getConfigurationElementsFor(PHPDebugPlugin.getID(), EXTENSION_POINT_NAME); for (int i = 0; i < elements.length; i++) { final IConfigurationElement element = elements[i]; if (INITIALIZER_TAG.equals(element.getName())) { if (RUN.equals(element.getAttribute(MODE_ATTRIBUTE))) { runInitializers.put(element.getAttribute(ID_ATTRIBUTE), new DebugParametersInitializerFactory(element)); } else if (PROFILE.equals(element.getAttribute(MODE_ATTRIBUTE))) { profileInitializers.put(element.getAttribute(ID_ATTRIBUTE), new DebugParametersInitializerFactory(element)); } else { debugInitializers.put(element.getAttribute(ID_ATTRIBUTE), new DebugParametersInitializerFactory(element)); } } } } private static DebugParametersInitializersRegistry getInstance() { if (instance == null) { instance = new DebugParametersInitializersRegistry(); } return instance; } private Dictionary getInitializersFactories(String mode) { if (RUN.equals(mode)) { return runInitializers; } if (PROFILE.equals(mode)) { return profileInitializers; } return debugInitializers; } /** * Return debug parameters initializer according to its ID. The returned * IDebugParametersInitializer is always a new instance. * * @param id * The debug parameters initializer ID * @return A new instance of an IDebugParametersInitializer */ public static IDebugParametersInitializer getParametersInitializer(String id) throws Exception { DebugParametersInitializerFactory initializerFactory = (DebugParametersInitializerFactory) getInstance() .getInitializersFactories(RUN).get(id); if (initializerFactory == null) { initializerFactory = (DebugParametersInitializerFactory) getInstance().getInitializersFactories(PROFILE) .get(id); } if (initializerFactory == null) { initializerFactory = (DebugParametersInitializerFactory) getInstance().getInitializersFactories(DEBUG) .get(id); } if (initializerFactory != null) { return initializerFactory.createParametersInitializer(); } return null; } /** * Returns the currently configured IDebugParametersInitializer. The * returned IDebugParametersInitializer is always a new instance. * * @return A new instance of the current IDebugParametersInitializer * (according to the preferences). */ public static IDebugParametersInitializer getCurrentDebugParametersInitializer() { try { String id = Platform.getPreferencesService().getString(PHPDebugPlugin.ID, IPHPDebugConstants.PHP_DEBUG_PARAMETERS_INITIALIZER, null, null); return getParametersInitializer(id); } catch (Exception e) { PHPDebugPlugin.log(e); } return null; } /** * Return best matching debug parameters initializer according the the * launch The returned IDebugParametersInitializer is always a new instance. * * @param launch * @return A new instance of a best match IDebugParametersInitializer */ public static IDebugParametersInitializer getBestMatchDebugParametersInitializer(ILaunch launch) { try { Dictionary factories = getInstance().getInitializersFactories(launch.getLaunchMode()); // 1st try to get the one with matching configuration type for (Enumeration e = factories.elements(); e.hasMoreElements();) { DebugParametersInitializerFactory initializerFactory = (DebugParametersInitializerFactory) e .nextElement(); String configurationTypeId = initializerFactory.element .getAttribute(LAUNCH_CONFIGURATION_TYPE_ATTRIBUTE); if (configurationTypeId != null && !"".equals(configurationTypeId) //$NON-NLS-1$ && configurationTypeId.equals(launch.getLaunchConfiguration().getType().getIdentifier())) { return initializerFactory.createParametersInitializer(); } } // Then if not found try to get with empty configuration type and // not a default one for (Enumeration e = factories.elements(); e.hasMoreElements();) { DebugParametersInitializerFactory initializerFactory = (DebugParametersInitializerFactory) e .nextElement(); String configurationTypeId = initializerFactory.element .getAttribute(LAUNCH_CONFIGURATION_TYPE_ATTRIBUTE); if ((configurationTypeId == null || "" //$NON-NLS-1$ .equals(configurationTypeId)) && !PHPDebugPlugin.getID().equals(initializerFactory.element.getNamespaceIdentifier())) { return initializerFactory.createParametersInitializer(); } } // Last, if nothing found get the default for (Enumeration e = factories.elements(); e.hasMoreElements();) { DebugParametersInitializerFactory initializerFactory = (DebugParametersInitializerFactory) e .nextElement(); if (PHPDebugPlugin.getID().equals(initializerFactory.element.getNamespaceIdentifier())) { return initializerFactory.createParametersInitializer(); } } } catch (Exception e) { PHPDebugPlugin.log(e); } return getCurrentDebugParametersInitializer(); } /** * Instantiation proxy of the initializer object */ class DebugParametersInitializerFactory { private IConfigurationElement element; private IDebugParametersInitializer parametersInitializer; public DebugParametersInitializerFactory(IConfigurationElement element) { this.element = element; } public IDebugParametersInitializer createParametersInitializer() { SafeRunner.run(new SafeRunnable( "Error creation extension for extension-point org.eclipse.php.internal.debug.core.phpDebugParametersInitializers") { //$NON-NLS-1$ public void run() throws Exception { parametersInitializer = (IDebugParametersInitializer) element .createExecutableExtension(CLASS_ATTRIBUTE); } }); parametersInitializer.setDebugHandler(element.getAttribute(HANDLER_ATTRIBUTE)); return parametersInitializer; } } }