Contribuciones de objeto sensibles al contenido

Anteriormente, los menús contextuales de algunas aplicaciones estaban limitados por la exclusión de algunas opciones de menú. Esto se basaba en la información periférica conocida, como el número de recursos seleccionados, el nombre físico del archivo, el tipo de recurso, etcétera. En algunos casos, se conocía una cantidad restringida de información sobre el contenido de un recurso, y esto reducía notablemente las opciones de menú inservibles. Dicha información podría ser de gran utilidad en los archivos XML, ya que se dan numerosas situaciones en las que una acción es aplicable para un tipo de archivo XML, pero no para otro, como ocurre con los archivos XML que contienen scripts Ant. La acción Ejecutar Ant..., si bien es lógica en el menú contextual, no es una acción aplicable a un archivo XML que se utilice para definir un conector.

Con la adición del punto de extensión org.eclipse.core.runtime.contentTypes, Eclipse proporciona ahora un 'tipo de contenido', que permite que los conectores contribuyan al catálogo de tipos de contenido de la plataforma, y también están disponibles unas clases que se llaman Descriptores de tipo de contenido. Para los desarrolladores que proporcionan tipos de contenido propios, se dispone asimismo de dos descriptores de tipo de contenido incorporados y personalizables: BinarySignatureDescriber (para los tipos de contenido binario) y XMLRootElementContentDescriber (para los tipos de contenido basados en texto XML). Además, los proveedores de conectores pueden crear descriptores de contenido propios; encontrará los detalles en la guía del desarrollador de conectores de plataforma (Guía del programador > Visión general del tiempo de ejecución > Tipos de contenido).

XMLRootElementContentDescriber

Ahora es posible definir contribuciones de objeto específicas de un archivo XML con un código de nivel superior dado o que especifique una DTD dada. Para ello, se define una extensión del punto de extensión org.eclipse.core.runtime.contentTypes con una clase de descriptor igual a XMLRootElementContentDescriber y parámetros que indiquen el nombre del código de nivel superior o el nombre de la DTD, de la siguiente manera:

      <extension
       point="org.eclipse.core.runtime.contentTypes">
       <content-type
           id=<id>
           name=<name> 	
           base-type="org.eclipse.core.runtime.xml">
           <describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
               <parameter name="element" value=valorCódigo />
           </describer>
       </content-type>
   </extension>
o bien
      <extension
       point="org.eclipse.core.runtime.contentTypes">
       <content-type
           id=<id>
           name=<name> 	
           base-type="org.eclipse.core.runtime.xml">
           <describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
               <parameter name="dtd" value=valorDtd />
           </describer>
       </content-type>
   </extension>
Aquí, valorCódigo representa el nombre del código de nivel superior con el que debe coincidir

Y valorDtd representa el nombre de la DTD tal como se ve en el archivo XML.

Fíjese en la siguiente contribución de objeto de un archivo plugin.xml:

      <extension
       point="org.eclipse.core.runtime.contentTypes">
       <content-type 
           id="topElementContentType"
           name="Prueba reconocimiento de elemento de nivel superior" 	
           base-type="org.eclipse.core.runtime.xml"
           priority="high">
           <describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
               <parameter name="element" value="myTag" />
           </describer>
       </content-type>
   </extension>

   <extension
       point="org.eclipse.core.runtime.contentTypes">
       <content-type 
           id="dtdContentType"
           name="Prueba reconocimiento de elemento DTD" 	
           base-type="org.eclipse.core.runtime.xml"
           priority="high">
           <describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
               <parameter name="dtd" value="myDTD.xml" />
           </describer>
       </content-type>
   </extension>
   <extension point="org.eclipse.ui.popupMenus">
       <objectContribution
           id="org.eclipse.ui.examples.objectContributions"
           objectClass="org.eclipse.core.resources.IFile"
           nameFilter="*.xml">
           <visibility>
               <or>
                   <objectState
                       name="contentTypeId"
                       value="org.eclipse.ui.examples.topElementContentType"/>
                   <objectState
                       name="contentTypeId"
                       value="org.eclipse.ui.examples.dtdContentType"/>
               </or>
           </visibility>
           <action id="org.eclipse.ui.examples.objectContributions.action1"
               label="%PopupMenus.action"
               icon="icons/ctool16/openbrwsr.png"
               menubarPath="additions"
               class="org.eclipse.ui.examples.objectContributions.PopupMenuActionDelegate"
               enablesFor="1">
           </action>
       </objectContribution>
   </extension>

Esto hará que action1 esté visible para cualquier IFile cuyo nombre coincida con *.xml, siempre que contenga myTag como código XML de nivel superior o que utilice la DTD cuyo nombre es myDTD.xml. Así coincidirán los siguientes archivos XML:

<?xml version="1.0" encoding="UTF-8"?>
<myTag
   id="org.eclipse.ui.workbench"
  name="%pluginName"
  version="3.0.0"
  provider-name="%providerName"
  class="org.eclipse.ui.internal.WorkbenchPlugin">
</myTag>

o bien

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Book SYSTEM "myDTD.xml">
<fragment
   id="org.eclipse.ui.workbench"
  name="%pluginName"
	version="3.0.0"
	provider-name="%providerName"
	class="org.eclipse.ui.internal.WorkbenchPlugin">
	<runtime>
	   <library name="workbench.jar">
	      <export name="*"/>
		  <packages prefixes="org.eclipse.ui, org.eclipse.jface"/>
	   </library>
	</runtime>
</fragment>

BinarySignatureDescriber

BinarySignatureDescriber es un descriptor de contenido que detecta una firma ('signature') binaria especificada en un desplazamiento dado de un archivo. Este descriptor se utiliza de la misma manera que XMLRootElementContentDescriber, solo que toma los parámetros "signature", "offset" y "required", en lugar de "element" o "dtd". El Javadoc de BinarySignatureDescriber proporciona los detalles completos de la utilización de la clase de este descriptor de contenido.