Para que outros plug-ins estendam ou personalizem a funcionalidade de seu plug-in, é necessário definir um ponto de extensão. Como com as extensões, a primeira etapa na definição de um ponto de extensão é incluir alguma marcação no arquivo plugin.xml de seu plug-in. A seguir encontra-se um exemplo:
<?xml version="1.0" ?><plug-in name="Plug-in de Ponto de Extensão Simples" id="org.eclipse.sample" version="1.0"> <runtime> <library name="extpt.jar" /> </runtime> <extension-point name="Ponto de Extensão de Exemplo" id="sampleExtensionPoint"/> </plugin>
Isso é o que deve ser feito para definir seu próprio ponto de extensão. A estrutura das extensões que se conectam a esse ponto de extensão não são interpretadas pela plataforma, em vez disso, devem seguir um esquema definido pelo provedor do ponto de extensão. A única restrição é que a marcação de extensão deve ser XML válido. Depois de ter definido seu ponto de extensão, você pode consultar o registro do plug-in da plataforma no tempo de execução para consultar e processar as extensões que possam existir. No tempo de execução, as extensões são manifestadas como objetos IExtension. As extensões, por sua vez, são compostas de uma árvore de objetos IConfigurationElement, um para cada elemento na marcação da extensão. O trecho de código a seguir consulta o registro do plug-in de quaisquer as extensões que estejam associadas ao ponto de extensão definido acima.
IPluginRegistry registry = Platform.getPluginRegistry(); IExtensionPoint point = registry.getExtensionPoint("org.eclipse.sample.sampleExtensionPoint"); if (point != null) { IExtension[] extensions = point.getExtensions(); System.out.println("Found " + extensions.length + " extensions"); }
Em casos simples, a única interação entre um ponto de extensão e suas extensões está contida na marcação da extensão. A extensão pode fornecer alguns dados ou definição de preferência diretamente no XML da marcação da extensão e o plug-in de ponto de extensão lerá e processará essas informações para fornecer comportamento personalizado.
Com pontos de extensão mais avançados, é possível interagir no tempo de execução com objetos definidos pela extensão. O problema aqui é que o plug-in que define o ponto de extensão normalmente não conhece os nomes das classes e dos pacotes na extensão, portanto, ele deve definir uma interface para descrever a estrutura de classe esperada. Em seguida, ele pode instanciar classes no plugin da extensão utilizando um IExecutableExtension, e utilizar a interface para interagir com o objeto no tempo de execução.
Para ilustrar com um exemplo, o trecho a seguir de um arquivo plugin.xml define uma extensão que é ligada ao nosso ponto de extensão de amostra que foi definido anteriormente:
<extension name="Extensão de Exemplo" id="myExtension" point="org.eclipse.sample.sampleExtensionPoint"> <someObject> <run class="org.eclipse.examples.SomeClass"/> </someObject> </extension>
Essa extensão inclui marcação para uma extensão executável, que inclui o nome da classe a ser instanciado. Essa classe deve ser compatível com uma interface definida pelo plug-in que definiu o ponto de extensão. Conforme descrito anteriormente, os nomes das tags neste exemplo ("someObject" e "run") são arbitrários. Essas tags serão definidas pelo esquema do ponto de extensão.
Neste exemplo, daremos o nome de ISomeInterface para a interface da extensão executável. O trecho de código a seguir no plug-in do ponto de extensão consultará o registro do plug-in e instanciará todas as extensões executáveis do ponto de extensão "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("Found an executable extension: " + object); } } }
Isso é tudo que há! Para obter mais informações, procure no javadoc o pacote org.eclipse.core.runtime ou examine o ponto de extensão definido na ferramenta leia-me (Consulte o Guia de Exemplos para obter instruções de instalação). O melhor exemplo a ser visto é o que contém pontos de extensão definidos pela própria plataforma Eclipse.