/**
* Copyright (c) 2015 Genuitec LLC.
* 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:
* Piotr Tomiak <piotr@genuitec.com> - initial API and implementation
*/
package tern.eclipse.ide.server.nodejs.core.debugger;
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import tern.TernException;
import tern.eclipse.ide.server.nodejs.core.TernNodejsCorePlugin;
import tern.eclipse.ide.server.nodejs.internal.core.Trace;
import tern.server.nodejs.process.INodejsProcess;
public class NodejsDebuggersManager {
private static final String EXT_NODEJS_DEBUGGERS = "nodeJSDebuggers"; //$NON-NLS-1$
private static final String EL_DEBUGGER = "debugger"; //$NON-NLS-1$
private static final String ATTR_ID = "id"; //$NON-NLS-1$
private static final String ATTR_NAME = "name"; //$NON-NLS-1$
private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
private static Map<String, INodejsDebugger> debuggers = new LinkedHashMap<String, INodejsDebugger>();
static {
// Add supported debuggers
loadExtensionPoint();
// Make debuggers map unmodifiable
debuggers = Collections.unmodifiableMap(debuggers);
}
private NodejsDebuggersManager() {
}
public static Collection<INodejsDebugger> getDebuggers() {
return debuggers.values();
}
private static void loadExtensionPoint() {
IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
.getExtensionPoint(TernNodejsCorePlugin.PLUGIN_ID,
EXT_NODEJS_DEBUGGERS);
IConfigurationElement[] elements = extensionPoint
.getConfigurationElements();
for (IConfigurationElement el : elements) {
if (el.getName().equals(EL_DEBUGGER)) {
try {
addDebugger(new NodejsDebugger(el));
} catch (Exception ex) {
Trace.trace(Trace.SEVERE, ex.getMessage(), ex);
}
}
}
}
private static void addDebugger(INodejsDebugger debugger) {
debuggers.put(debugger.getId(), debugger);
}
public static INodejsDebugger getDebugger(String debugger) {
if (debugger == null) {
return null;
}
return debuggers.get(debugger);
}
private static class NodejsDebugger implements INodejsDebugger {
private INodejsDebuggerDelegate delegate;
private String name;
private String id;
public NodejsDebugger(IConfigurationElement el) throws Exception {
name = el.getAttribute(ATTR_NAME);
id = el.getAttribute(ATTR_ID);
delegate = (INodejsDebuggerDelegate) el
.createExecutableExtension(ATTR_CLASS);
if (name == null || name.trim().isEmpty()) {
throw new RuntimeException("Debugger name cannot be empty");
}
if (id == null || id.trim().isEmpty()) {
throw new RuntimeException("Debugger id cannot be empty");
}
}
@Override
public String getName() {
return name;
}
@Override
public String getId() {
return id;
}
@Override
public boolean isInstalled() {
return delegate.isInstalled();
}
@Override
public boolean canSupportDebug() {
return delegate.canSupportDebug();
}
@Override
public INodejsProcess createProcess(IFile jsFile, File workingDir, File nodejsInstallPath)
throws TernException {
return delegate.createProcess(jsFile, workingDir, nodejsInstallPath);
}
}
}