Cuando desee permitir que otros conectores amplíen o personalicen la funcionalidad de su conector, debe definir un punto de extensión. Como sucede con las extensiones, el primer paso para definir un punto de extensión consiste en añadir códigos XML al archivo plugin.xml del conector. A continuación se ofrece un ejemplo:
<?xml version="1.0" ?> <plugin name="Conector de punto de extensión simple" id="org.eclipse.sample" version="1.0"> <runtime> <library name="extpt.jar" /> </runtime> <extension-point name="Punto de extensión de ejemplo" id="sampleExtensionPoint"/> </plugin>
Esto es todo lo que tiene que hacer para definir su propio punto de extensión. La estructura de las extensiones que se conectan a este punto de extensión no viene interpretada por la plataforma, sino que debe seguir un esquema definido por el proveedor del punto de extensión. La única restricción es que los códigos XML de la extensión tienen que ser válidos. Cuando haya definido el punto de extensión, puede consultar el registro de conectores de la plataforma en tiempo de ejecución para obtener las extensiones que puedan existir y procesarlas. En tiempo de ejecución, las extensiones se manifiestan como objetos IExtension. A su vez, las extensiones constan de un árbol de objetos IConfigurationElement, uno para cada elemento de los códigos XML de la extensión. El siguiente fragmento de código consulta el registro de conectores para obtener las extensiones que estén asociadas al punto de extensión definido anteriormente.
IPluginRegistry registry = Platform.getPluginRegistry(); IExtensionPoint point = registry.getExtensionPoint("org.eclipse.sample.sampleExtensionPoint"); if (point != null) { IExtension[] extensions = point.getExtensions(); System.out.println("Se han encontrado " + extensions.length + " extensiones"); }
En los casos simples, los códigos XML de la extensión contienen la única interacción entre un punto de extensión y sus extensiones. La extensión puede proporcionar algunos datos o valores de preferencias directamente en el XML de los códigos de la extensión; luego, el conector del punto de extensión lee y procesa esa información para proporcionar un comportamiento personalizado.
Con los puntos de extensión más avanzados, es posible que desee interaccionar en tiempo de ejecución con los objetos definidos por la extensión. El truco consiste en que el conector que define el punto de extensión normalmente no sabrá nada sobre los nombres de clases y paquetes de la extensión, por lo que tendrá que definir una interfaz para describir la estructura de clases que espera. Luego puede crear instancias de las clases en el conector de la extensión mediante una interfaz IExecutableExtension y utilizarla para interaccionar con el objeto en tiempo de ejecución.
Para ilustrar esto con un ejemplo, el fragmento siguiente procedente de un archivo plugin.xml define una extensión que se engancha en el punto de extensión de ejemplo definido anteriormente:
<extension name="Extensión de ejemplo" id="myExtension" point="org.eclipse.sample.sampleExtensionPoint"> <someObject> <run class="org.eclipse.examples.SomeClass"/> </someObject> </extension>
Esta extensión incluye códigos XML de una extensión ejecutable, que indica el nombre de la clase de la que hay que crear una instancia. Esta clase debe estar en conformidad con una interfaz definida por el conector que ha definido el punto de extensión. Tal como se ha explicado anteriormente, los nombres de los códigos de este ejemplo ("someObject" y "run") son arbitrarios. El esquema del punto de extensión definirá estos códigos.
Para este ejemplo, digamos que la interfaz de la extensión ejecutable se llama ISomeInterface. El siguiente fragmento de código del conector del punto de extensión consultará el registro de conectores y creará una instancia de todas las extensiones ejecutables para el punto de extensión "sampleExtensionPoint":
IPluginRegistry registry = Platform.getPluginRegistry(); IExtensionPoint point = registry.getExtensionPoint("org.eclipse.sample.sampleExtensionPoint"); IExtension[] extensions = point.getExtensions(); for (int i = 0; i < extensions.length; i++) { IConfigurationElement[] elements = extensions[i].getConfigurationElements(); for (int j = 0; j < elements.length; j++) { if ("someObject".equals(elements[j].getName())) { ISomeInterface object = (ISomeInterface)elements[j].createExecutableExtension("run"); System.out.println("Se ha encontrado una extensión ejecutable: " + object); } } }
Eso es todo. Para obtener más información, busque el paquete org.eclipse.core.runtime en el javadoc, o bien vea el punto de extensión definido en la herramienta readme (consulte el Manual de los ejemplos para obtener las instrucciones de instalación). El mejor ejemplo que puede consultarse son los puntos de extensión definidos por la propia plataforma Eclipse.