/******************************************************************************* * 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.pathmapper; import java.util.*; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.php.internal.core.util.preferences.IXMLPreferencesStorable; import org.eclipse.php.internal.core.util.preferences.XMLPreferencesReader; import org.eclipse.php.internal.core.util.preferences.XMLPreferencesWriter; import org.eclipse.php.internal.debug.core.IPHPDebugConstants; import org.eclipse.php.internal.debug.core.PHPDebugPlugin; import org.eclipse.php.internal.debug.core.launching.PHPLaunchUtilities; import org.eclipse.php.internal.debug.core.preferences.IPHPExesListener; import org.eclipse.php.internal.debug.core.preferences.PHPExesEvent; import org.eclipse.php.internal.debug.core.preferences.PHPexeItem; import org.eclipse.php.internal.debug.core.preferences.PHPexes; import org.eclipse.php.internal.server.core.Server; import org.eclipse.php.internal.server.core.manager.IServersManagerListener; import org.eclipse.php.internal.server.core.manager.ServerManagerEvent; import org.eclipse.php.internal.server.core.manager.ServersManager; @SuppressWarnings("restriction") public class PathMapperRegistry implements IXMLPreferencesStorable { private class MapperOwnerListener implements IServersManagerListener, IPHPExesListener { /* * (non-Javadoc) * * @see * org.eclipse.php.internal.server.core.manager.IServersManagerListener# * serverAdded(org.eclipse.php.internal.server.core.manager. * ServerManagerEvent) */ public void serverAdded(ServerManagerEvent event) { if (!serverPathMapper.containsKey(event.getServer())) { serverPathMapper.put(event.getServer(), new PathMapper()); } } /* * (non-Javadoc) * * @see * org.eclipse.php.internal.server.core.manager.IServersManagerListener# * serverModified(org.eclipse.php.internal.server.core.manager. * ServerManagerEvent) */ public void serverModified(ServerManagerEvent event) { } /* * (non-Javadoc) * * @see * org.eclipse.php.internal.server.core.manager.IServersManagerListener# * serverRemoved(org.eclipse.php.internal.server.core.manager. * ServerManagerEvent) */ public void serverRemoved(ServerManagerEvent event) { serverPathMapper.remove(event.getServer()); } /* * (non-Javadoc) * * @see * org.eclipse.php.internal.debug.core.preferences.IPHPExesListener# * phpExeAdded(org.eclipse.php.internal.debug.core.preferences. * PHPExesEvent) */ public void phpExeAdded(PHPExesEvent event) { if (!phpExePathMapper.containsKey(event.getPHPExeItem())) { phpExePathMapper.put(event.getPHPExeItem(), new PathMapper()); } } /* * (non-Javadoc) * * @see * org.eclipse.php.internal.debug.core.preferences.IPHPExesListener# * phpExeRemoved(org.eclipse.php.internal.debug.core.preferences. * PHPExesEvent) */ public void phpExeRemoved(PHPExesEvent event) { phpExePathMapper.remove(event.getPHPExeItem()); } } private static final String PATH_MAPPER_PREF_KEY = PHPDebugPlugin.getID() + ".pathMapper"; //$NON-NLS-1$ private static PathMapperRegistry instance; private final Map<Server, PathMapper> serverPathMapper; private final Map<PHPexeItem, PathMapper> phpExePathMapper; private final Map<ILaunchConfiguration, PathMapper> launchConfigPathMapper; private final MapperOwnerListener ownerListener; private PathMapperRegistry() { // Make it weak to remove entry after dropping the launch configuration launchConfigPathMapper = new WeakHashMap<ILaunchConfiguration, PathMapper>(); serverPathMapper = new HashMap<Server, PathMapper>(); phpExePathMapper = new HashMap<PHPexeItem, PathMapper>(); ownerListener = new MapperOwnerListener(); // Load persistent mappings from preferences List<Map<String, Object>> elements = XMLPreferencesReader .read(InstanceScope.INSTANCE.getNode(PHPDebugPlugin.ID), PATH_MAPPER_PREF_KEY, true); if (elements.size() == 1) { restoreFromMap(elements.get(0)); } } /** * Returns singleton instance for this registry. * * @return singleton instance for this registry */ public synchronized static PathMapperRegistry getInstance() { if (instance == null) { instance = new PathMapperRegistry(); } return instance; } /** * Returns path mapper that corresponds to the given PHPexe item * * @param phpExe * PHPExe item * @return path mapper, or <code>null</code> if there's no one */ public static PathMapper getByPHPExe(PHPexeItem phpExe) { PathMapper result = getInstance().phpExePathMapper.get(phpExe); if (result == null) { result = new PathMapper(); getInstance().phpExePathMapper.put(phpExe, result); PHPexes.getInstance().addPHPExesListener(getInstance().ownerListener); } return result; } /** * Return path mapper which corresponding to the given Server instance * * @param server * Server instance * @return path mapper, or <code>null</code> if there's no one */ public static PathMapper getByServer(Server server) { PathMapper result = getInstance().serverPathMapper.get(server); if (result == null) { result = new PathMapper(); getInstance().serverPathMapper.put(server, result); /* * Create the link to servers manager here in order not to create * tightly coupled relationship. */ ServersManager.addManagerListener(getInstance().ownerListener); } return result; } /** * Returns path mapper associated with the given launch configuration * * @param launchConfiguration * Launch configuration * @return path mapper */ public static PathMapper getByLaunchConfiguration(ILaunchConfiguration launchConfiguration) { PathMapper pathMapper = null; try { String serverName = launchConfiguration.getAttribute(Server.NAME, (String) null); if (serverName != null) { /* * Try to find path mapper with the use of the server that might * be bound to the corresponding launch configuration. */ pathMapper = getByServer(ServersManager.getServer(serverName)); } else if (PHPLaunchUtilities.isLaunchConfigurationTypeOf(launchConfiguration, IPHPDebugConstants.PHPRemoteLaunchType)) { /* * If no server could be found (launch configuration for * externally triggered sessions), create temporary one and bind * it with the launch configuration. */ pathMapper = getInstance().launchConfigPathMapper.get(launchConfiguration); if (pathMapper == null) { pathMapper = new PathMapper(); getInstance().launchConfigPathMapper.put(launchConfiguration, pathMapper); } } } catch (CoreException e) { PHPDebugPlugin.log(e); } return pathMapper; } /** * Persist settings to preference file. */ public static void storeToPreferences() { XMLPreferencesWriter.write(InstanceScope.INSTANCE.getNode(PHPDebugPlugin.ID), PATH_MAPPER_PREF_KEY, getInstance()); } /* * (non-Javadoc) * * @see * org.eclipse.php.internal.core.util.preferences.IXMLPreferencesStorable# * restoreFromMap(java.util.Map) */ @SuppressWarnings("unchecked") public synchronized void restoreFromMap(Map<String, Object> map) { if (map == null) { return; } serverPathMapper.clear(); phpExePathMapper.clear(); map = (Map<String, Object>) map.get("pathMappers"); //$NON-NLS-1$ if (map == null) { return; } Iterator<String> i = map.keySet().iterator(); while (i.hasNext()) { Map<String, Object> entryMap = (Map<String, Object>) map.get(i.next()); String serverName = (String) entryMap.get("server"); //$NON-NLS-1$ String phpExeFile = (String) entryMap.get("phpExe"); //$NON-NLS-1$ String phpIniFile = (String) entryMap.get("phpIni"); //$NON-NLS-1$ PathMapper pathMapper = new PathMapper(); pathMapper.restoreFromMap((Map<String, Object>) entryMap.get("mapper")); //$NON-NLS-1$ if (serverName != null) { Server server = ServersManager.getServer(serverName); if (server != null) { serverPathMapper.put(server, pathMapper); } } else if (phpExeFile != null) { PHPexeItem phpExeItem = PHPexes.getInstance().getItemForFile(phpExeFile, phpIniFile); if (phpExeItem != null) { phpExePathMapper.put(phpExeItem, pathMapper); } } } } /* * (non-Javadoc) * * @see * org.eclipse.php.internal.core.util.preferences.IXMLPreferencesStorable# * storeToMap() */ public synchronized Map<String, Object> storeToMap() { Map<String, Object> elements = new HashMap<String, Object>(); Iterator<?> i = serverPathMapper.keySet().iterator(); int c = 1; while (i.hasNext()) { Map<String, Object> entry = new HashMap<String, Object>(); Server server = (Server) i.next(); PathMapper pathMapper = serverPathMapper.get(server); entry.put("server", server.getName()); //$NON-NLS-1$ if (pathMapper != null) { entry.put("mapper", pathMapper.storeToMap()); //$NON-NLS-1$ } elements.put("item" + (c++), entry); //$NON-NLS-1$ } i = phpExePathMapper.keySet().iterator(); while (i.hasNext()) { Map<String, Object> entry = new HashMap<String, Object>(); PHPexeItem phpExeItem = (PHPexeItem) i.next(); PathMapper pathMapper = phpExePathMapper.get(phpExeItem); entry.put("phpExe", phpExeItem.getExecutable().toString()); //$NON-NLS-1$ if (phpExeItem.getINILocation() != null) { entry.put("phpIni", phpExeItem.getINILocation().toString()); //$NON-NLS-1$ } entry.put("mapper", pathMapper.storeToMap()); //$NON-NLS-1$ elements.put("item" + (c++), entry); //$NON-NLS-1$ } Map<String, Object> root = new HashMap<String, Object>(); root.put("pathMappers", elements); //$NON-NLS-1$ return root; } }