adding Connector extension point and limited use of it in the launcher
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/META-INF/MANIFEST.MF b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/META-INF/MANIFEST.MF
index 6ac4000..9b4c96c 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Rhino JSDI (Incubation)
-Bundle-SymbolicName: org.eclipse.e4.languages.javascript.debug.jsdi.rhino
+Bundle-SymbolicName: org.eclipse.e4.languages.javascript.debug.jsdi.rhino;singleton:=true
Bundle-Version: 0.9.0.qualifier
Bundle-RequiredExecutionEnvironment: OSGi/Minimum-1.2
Export-Package: org.eclipse.e4.languages.javascript.jsdi.rhino.connect
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/build.properties b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/build.properties
index 34d2e4d..e9863e2 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/build.properties
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/build.properties
@@ -1,4 +1,5 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
- .
+ .,\
+ plugin.xml
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/plugin.xml b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/plugin.xml
new file mode 100644
index 0000000..ca438a8
--- /dev/null
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/plugin.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ id="rhinoConnector"
+ name="Rhino Connector"
+ point="org.eclipse.e4.languages.javascript.debug.jsdi.connectors">
+ <connector
+ class="org.eclipse.e4.languages.javascript.jsdi.rhino.connect.RhinoAttachingConnector">
+ </connector>
+ </extension>
+
+</plugin>
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.model/plugin.xml b/bundles/org.eclipse.e4.languages.javascript.debug.model/plugin.xml
index ca733ef..e0a59ed 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.model/plugin.xml
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.model/plugin.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
+ <extension-point id="org.eclipse.e4.languages.javascript.debug.jsdi.connectors" name="connectors" schema="schema/org.eclipse.e4.languages.javascript.debug.jsdi.connectors.exsd"/>
<extension
point="org.eclipse.debug.core.launchConfigurationTypes">
<launchConfigurationType
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.model/schema/org.eclipse.e4.languages.javascript.debug.jsdi.connectors.exsd b/bundles/org.eclipse.e4.languages.javascript.debug.model/schema/org.eclipse.e4.languages.javascript.debug.jsdi.connectors.exsd
new file mode 100644
index 0000000..534dbd7
--- /dev/null
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.model/schema/org.eclipse.e4.languages.javascript.debug.jsdi.connectors.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.e4.languages.javascript.debug.model" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.e4.languages.javascript.debug.model" id="org.eclipse.e4.languages.javascript.debug.jsdi.connectors" name="Connectors"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="connector"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="connector">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.e4.languages.javascript.jsdi.connect.Connector"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="implementation"/>
+ </appinfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.model/src/org/eclipse/e4/languages/internal/javascript/debug/launching/ConnectorsManager.java b/bundles/org.eclipse.e4.languages.javascript.debug.model/src/org/eclipse/e4/languages/internal/javascript/debug/launching/ConnectorsManager.java
new file mode 100644
index 0000000..07c2d4e
--- /dev/null
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.model/src/org/eclipse/e4/languages/internal/javascript/debug/launching/ConnectorsManager.java
@@ -0,0 +1,68 @@
+package org.eclipse.e4.languages.internal.javascript.debug.launching;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IRegistryEventListener;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.core.runtime.RegistryFactory;
+
+public class ConnectorsManager implements IRegistryEventListener {
+
+ private static final String JSDI_CONNECTORS = "org.eclipse.e4.languages.javascript.debug.jsdi.connectors"; //$NON-NLS-1$
+ private static final String CONNECTOR = "connector"; //$NON-NLS-1$
+ private static final String CLASS = "class"; //$NON-NLS-1$
+ private List connectors;
+
+ public ConnectorsManager() {
+ RegistryFactory.getRegistry().addListener(this, JSDI_CONNECTORS);
+ }
+
+ public synchronized List getConnectors() {
+ if (connectors != null)
+ return connectors;
+
+ connectors = new ArrayList();
+ IExtension[] extensions = RegistryFactory.getRegistry().getExtensionPoint(JSDI_CONNECTORS).getExtensions();
+ for (int i = 0; i < extensions.length; i++) {
+ IExtension extension = extensions[i];
+ try {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (int j = 0; j < elements.length; j++) {
+ IConfigurationElement element = elements[j];
+ if (!CONNECTOR.equalsIgnoreCase(element.getName())) {
+ // log it
+ continue;
+ }
+ connectors.add(element.createExecutableExtension(CLASS));
+ }
+ } catch (InvalidRegistryObjectException e) {
+ // skip this extension
+ } catch (CoreException e) {
+ // log it
+ // skip this extension
+ }
+ }
+ return connectors;
+ }
+
+ public void added(IExtension[] extensions) {
+ connectors = null;
+ }
+
+ public void added(IExtensionPoint[] extensionPoints) {
+ connectors = null;
+ }
+
+ public void removed(IExtension[] extensions) {
+ connectors = null;
+ }
+
+ public void removed(IExtensionPoint[] extensionPoints) {
+ connectors = null;
+ }
+}
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.model/src/org/eclipse/e4/languages/internal/javascript/debug/launching/RemoteJavaScriptLaunchDelegate.java b/bundles/org.eclipse.e4.languages.javascript.debug.model/src/org/eclipse/e4/languages/internal/javascript/debug/launching/RemoteJavaScriptLaunchDelegate.java
index 599b1c9..6b04198 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.model/src/org/eclipse/e4/languages/internal/javascript/debug/launching/RemoteJavaScriptLaunchDelegate.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.model/src/org/eclipse/e4/languages/internal/javascript/debug/launching/RemoteJavaScriptLaunchDelegate.java
@@ -1,6 +1,7 @@
package org.eclipse.e4.languages.internal.javascript.debug.launching;
import java.io.IOException;
+import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
@@ -12,12 +13,13 @@
import org.eclipse.debug.core.model.LaunchConfigurationDelegate;
import org.eclipse.e4.languages.javascript.debug.model.JSDIDebugTarget;
import org.eclipse.e4.languages.javascript.jsdi.VirtualMachine;
+import org.eclipse.e4.languages.javascript.jsdi.connect.AttachingConnector;
import org.eclipse.e4.languages.javascript.jsdi.connect.Connector.Argument;
-import org.eclipse.e4.languages.javascript.jsdi.rhino.connect.RhinoAttachingConnector;
public class RemoteJavaScriptLaunchDelegate extends LaunchConfigurationDelegate {
final static String LAUNCH_URI = "launch_uri"; //$NON-NLS-1$
+ private final ConnectorsManager connectorsManager = new ConnectorsManager();
/*
* (non-Javadoc)
@@ -26,14 +28,17 @@
*/
public void launch(ILaunchConfiguration configuration, String mode, final ILaunch launch, IProgressMonitor monitor) throws CoreException {
+ List connectors = connectorsManager.getConnectors();
+ if (connectors.isEmpty()) {
+ throw new CoreException(new Status(IStatus.ERROR, "org.eclipse.e4.languages.internal.javascript.debug.model", "No Connectors found"));
+ }
+ // TODO: factor out Connector creation. This is temporary
+ AttachingConnector rhinoConnector = (AttachingConnector) connectors.get(0);
String port = (String) configuration.getAttribute(ILaunchConstants.PORT, "9000");
- RhinoAttachingConnector rhinoConnector = new RhinoAttachingConnector();
Map arguments = rhinoConnector.defaultArguments();
Argument portArgument = (Argument) arguments.get("port");
portArgument.setValue(port);
- // TODO: factor out Connector creation. This is temporary
- // because we are bound to Rhino for now
VirtualMachine vm;
try {
vm = rhinoConnector.attach(arguments);