package org.eclipse.dltk.debug.core;
import java.util.Comparator;
import java.util.HashMap;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.dltk.debug.core.model.IScriptTypeFactory;
import org.eclipse.dltk.internal.debug.core.model.VariableNameComparator;
public class ScriptDebugManager {
private static final String SCRIPT_DEBUG_MODEL_EXT_POINT = DLTKDebugPlugin.PLUGIN_ID
+ ".scriptDebugModel"; //$NON-NLS-1$
private static final String NATURE_ID = "natureId"; //$NON-NLS-1$
private static final String DEBUG_MODEL_ID = "debugModelId"; //$NON-NLS-1$
private static final String TYPE_FACTORY = "typeFactory"; //$NON-NLS-1$
private static final String VARIABLE_NAME_COMPARATOR = "variableNameComparator"; //$NON-NLS-1$
private static final String DEBUG_TOOLKIT = "debugToolkit"; //$NON-NLS-1$
private static ScriptDebugManager instance;
public static synchronized ScriptDebugManager getInstance() {
if (instance == null) {
instance = new ScriptDebugManager();
}
return instance;
}
private final HashMap natureToInfoMap;
private final HashMap modelToNatureMap;
private static class Info {
public final String debugModelId;
public final IScriptTypeFactory typeFactory;
public final Comparator comparator;
public final IDLTKDebugToolkit debugToolkit;
public Info(String debugModelId, IScriptTypeFactory typeFactory,
IDLTKDebugToolkit debugToolkit, Comparator comparator) {
this.debugModelId = debugModelId;
this.typeFactory = typeFactory;
this.debugToolkit = debugToolkit;
this.comparator = comparator;
}
}
private void loadExtenstionPoints() {
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtension[] extensions = registry.getExtensionPoint(
SCRIPT_DEBUG_MODEL_EXT_POINT).getExtensions();
for (int i = 0; i < extensions.length; i++) {
IExtension extension = extensions[i];
IConfigurationElement[] elements = extension
.getConfigurationElements();
if (elements.length > 0) {
IConfigurationElement element = elements[0];
final String natureId = element.getAttribute(NATURE_ID);
final String debugModelId = element
.getAttribute(DEBUG_MODEL_ID);
IScriptTypeFactory typeFactory = null;
try {
typeFactory = (IScriptTypeFactory) element
.createExecutableExtension(TYPE_FACTORY);
} catch (CoreException e) {
DLTKDebugPlugin.log(e);
}
Comparator comparator = null;
String comparatorId = element
.getAttribute(VARIABLE_NAME_COMPARATOR);
if (comparatorId != null) {
try {
comparator = (Comparator) element
.createExecutableExtension(VARIABLE_NAME_COMPARATOR);
} catch (CoreException e) {
DLTKDebugPlugin.log(e);
}
}
if (comparator == null) {
comparator = new VariableNameComparator();
}
IDLTKDebugToolkit debugToolkit = null;
if (element.getAttribute(DEBUG_TOOLKIT) != null) {
try {
debugToolkit = (IDLTKDebugToolkit) element
.createExecutableExtension(DEBUG_TOOLKIT);
} catch (Exception e) {
DLTKDebugPlugin.log(e);
}
}
if (debugToolkit == null) {
debugToolkit = new DefaultDebugToolkit();
}
if (natureId != null && debugModelId != null) {
natureToInfoMap.put(natureId, new Info(debugModelId,
typeFactory, debugToolkit, comparator));
modelToNatureMap.put(debugModelId, natureId);
}
}
}
}
private static class DefaultDebugToolkit extends AbstractDLTKDebugToolkit {
}
protected Info getInfo(String natureId) {
return (Info) natureToInfoMap.get(natureId);
}
protected ScriptDebugManager() {
natureToInfoMap = new HashMap();
modelToNatureMap = new HashMap();
loadExtenstionPoints();
}
public String getNatureByDebugModel(String debugModelId) {
return (String) modelToNatureMap.get(debugModelId);
}
public String getDebugModelByNature(String natureId) {
return getInfo(natureId).debugModelId;
}
public IScriptTypeFactory getTypeFactoryByNature(String natureId) {
return getInfo(natureId).typeFactory;
}
public IScriptTypeFactory getTypeFactoryByDebugModel(String debugModelId) {
return getTypeFactoryByNature(getNatureByDebugModel(debugModelId));
}
public Comparator getVariableNameComparatorByNature(String natureId) {
return getInfo(natureId).comparator;
}
public Comparator getVariableNameComparatorByDebugModel(String debugModelId) {
return getVariableNameComparatorByNature(getNatureByDebugModel(debugModelId));
}
public IDLTKDebugToolkit getDebugToolkitByNature(String natureId) {
return getInfo(natureId).debugToolkit;
}
public IDLTKDebugToolkit getDebugToolkitByDebugModel(String debugModelId) {
return getDebugToolkitByNature(getNatureByDebugModel(debugModelId));
}
}