/*******************************************************************************
* 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 org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchesListener;
import org.eclipse.php.internal.core.util.collections.IntHashtable;
import org.eclipse.php.internal.core.util.collections.IntMap;
import org.eclipse.php.internal.core.util.collections.IntMap.Entry;
import org.eclipse.swt.browser.Browser;
/**
* This class is responsible for mapping debug session id's to the ILaunch that
* is responsible for the session.
*
* @author Shalom Gibly
*/
public class PHPSessionLaunchMapper implements ILaunchesListener {
private static final String SYSTEM_DEBUG_PROPERTY = "org.eclipse.php.debug.ui.activeDebugging"; //$NON-NLS-1$
private static PHPSessionLaunchMapper instance;
private IntHashtable map;
private PHPSessionLaunchMapper() {
map = new IntHashtable(10);
}
private static PHPSessionLaunchMapper getInstance() {
if (instance == null) {
instance = new PHPSessionLaunchMapper();
DebugPlugin.getDefault().getLaunchManager().addLaunchListener(instance);
}
return instance;
}
/**
* Put a session Id mapping to an ILaunch.
*
* @param sessionID
* @param launch
*/
public static void put(int sessionID, ILaunch launch) {
getInstance().map.put(sessionID, launch);
}
/**
* Returns the ILaunch mapped to the given session ID. In case there is no
* such map, null is returned.
*
* @param sessionID
* @return The mapped ILaunch, or null if non exists.
*/
public static ILaunch get(int sessionID) {
return (ILaunch) getInstance().map.get(sessionID);
}
/**
* Removes the ILaunch mapped to the given sessionID and returns it. Returns
* null if no such session ID was found in the mapper.
*
* @param sessionID
* @return The removed ILaunch, or null if non exists.
*/
public static ILaunch remove(int sessionID) {
return (ILaunch) getInstance().map.remove(sessionID);
}
/**
* Update the "org.eclipse.php.debug.ui.activeDebugging" system property.
* This method is important for any action that is defined to be visible
* when a debug session is active (such as the Run to Line action).
*
* @param launches
*/
public static void updateSystemProperty(ILaunch[] launches) {
boolean hasActiveLaunch = false;
for (ILaunch launch : launches) {
hasActiveLaunch |= !launch.isTerminated();
}
System.setProperty(SYSTEM_DEBUG_PROPERTY, hasActiveLaunch ? "true" //$NON-NLS-1$
: "false"); //$NON-NLS-1$
}
public void launchesAdded(ILaunch[] launches) {
updateSystemProperty(launches);
}
public void launchesChanged(ILaunch[] launches) {
updateSystemProperty(launches);
}
@SuppressWarnings("unchecked")
public void launchesRemoved(ILaunch[] launches) {
// Remove any launch mapping if the launch was removed and we are still
// mapping it.
IntMap.Entry[] entries = new IntMap.Entry[map.size()];
map.entrySet().toArray(entries);
for (Entry entry : entries) {
for (ILaunch element : launches) {
if (entry.getValue() == element) {
map.remove(entry.getKey());
}
}
}
updateSystemProperty(launches);
/*
* In case we have no more running debug launches (mapped for Zend
* Debugger only), clear the browser's cache (cookies) to avoid any
* debug session trigger as a result of a remaining cookie.
*/
if (map.isEmpty()) {
Browser.clearSessions();
}
}
}