Contribuir con tipos de contenido

Proporcionar un nuevo tipo de contenido

La plataforma define algunos tipos fundamentales de contenido como, por ejemplo, texto plano y XML. Estos tipos de contenido se definen del mismo modo que los aportados por otros conectores. Observaremos el modo en que la plataforma define parte de los tipo de contenido para entender mejor la infraestructura de los tipos de contenido.

Los conectores definen tipos de contenido añadiendo una extensión al punto de extensión org.eclipse.core.runtime.contentTypes. En esta extensión, un conector especifica un ID simple y un nombre para el tipo de contenido (el ID completo es siempre el ID simple al que se antepone el espacio de nombres actual como prefijo). El siguiente fragmento muestra una versión recortada de la contribución de tipo de contenido org.eclipse.core.runtime.text:

	<extension point="org.eclipse.core.runtime.contentTypes">
		<content-type 
			id="text"
			name="%textContentTypeName">
			file-extensions="txt">
			<describer class="org.eclipse.core.internal.content.TextContentDescriber"/>
		</content-type>
		...

El atributo file-extensions define qué extensiones de archivo están asociadas al tipo de contenido (en este ejemplo, ".txt"). El atributo file-names (no utilizado en este caso) permite asociar nombres completos. La plataforma tienen en cuenta ambos atributos al realizar la detección y descripción de los tipos de contenido (si el cliente proporciona un nombre de archivo).

El elemento describer se utiliza para definir un descriptor de contenido para el tipo de contenido.

Detectar y describir contenido

Un tipo de contenido debe proporcionar un descriptor de contenido si hay características identificables que permitan la detección automática del tipo de contenido o propiedades interesantes en los datos que pertenezcan al tipo de contenido. En el caso de org.eclipse.core.runtime.text, no es posible discernir el tipo de contenido simplemente observando el contenido. Sin embargo, las corrientes de texto pueden ir precedidas de una marca de orden de bytes, que puede interesar a los clientes de propiedades, por lo que esto garantiza un descriptor de contenido.

El descriptor es una implementación de IContentDescriber o ITextContentDescriber. Este último es una especialización del anterior que deben implementar los descriptores de tipos de contenido orientados a texto. Independientemente de la naturaleza del tipo de contenido, el descriptor tiene dos responsabilidades: ayudar a determinar si su tipo de contenido es adecuado para una corriente de datos determinada y extraer propiedades interesantes de una corriente de datos que supuestamente pertenece a su tipo de contenido.

Se llama al método describe(stream, description) siempre que la plataforma intenta determinar el tipo de contenido de una corriente de datos determinada o describir su contenido. La descripción tiene el valor null si sólo se solicita la detección. De lo contrario, el descriptor debe intentar rellenar la descripción de contenido con las propiedades que pueda encontrar leyendo la corriente, y sólo ésas. Los códigos de tipo de contenido deben utilizarse para declarar propiedades que tengan valores por omisión (por ejemplo, org.eclipse.core.runtime.xml declara UTF-8 como juego de caracteres por omisión).

Al realizar su deber, se espera que el descriptor de contenido se ejecute lo más rápido posible. Cuantas menos corrientes de datos tenga que leer, mejor. Además, se espera que se declare la implementación del descriptor de contenido en un paquete exento de activación de conector (consulte la cabecera de manifiesto de paquete Eclipse-AutoStart). Dado que todos los descriptores se instancian cuando se inicializa la infraestructura de tipo de contenido, si no logra cumplir con este requisito se producirá una activación prematura, que debe evitarse. Las futuras implementaciones de la plataforma podrían negarse a instanciar descriptores si al hacerlo desencadenan la activación del conector correspondiente.

Ampliar un tipo de contenido existente

Los tipos de contenido son de naturaleza jerárquica. Esto permite a los tipos de contenido nuevos aprovechar los atributos o el comportamiento de tipos de contenido más generales. Por ejemplo, un tipo de contenido para datos XML se considera hijo del tipo de contenido de texto:

       <content-type 
	id="xml"
	name="%xmlContentTypeName"
	base-type="org.eclipse.core.runtime.text"
	file-extensions="xml">
	<describer class="org.eclipse.core.internal.content.XMLContentDescriber"/>
	<property name="charset" default="UTF-8"/>
</content-type>

Un archivo XML se considera una especie de archivo de texto, por lo que las características aplicables a éste último también deben poder aplicarse al primero.

Observe que el tipo de contenido XML altera temporalmente varios atributos de tipo de contenido definidos originalmente en el tipo de contenido Texto como, por ejemplo, las asociaciones de archivos y la implementación de descriptor. Además, este tipo de contenido declara un valor de propiedad por omisión para la propiedad charset. Esto quiere decir que, durante la descripción de contenido para una corriente de datos considerada como perteneciente al tipo de contenido XML, si el descriptor no rellena la propiedad de juego de caracteres, la plataforma la establecerá en "UTF-8".

Como otro ejemplo, el tipo de contenido org.eclipse.ant.core.antBuildFile (para scripts de construcción Ant) amplía el tipo de contenido XML:

       <content-type  
id="antBuildFile"
name="%antBuildFileContentType.name"
base-type="org.eclipse.core.runtime.xml"
file-names="build.xml"
file-extensions="macrodef,ent,xml">
<describer
class="org.eclipse.ant.internal.core.contentDescriber.AntBuildfileContentDescriber">
</describer>
</content-type>

Observe que el valor por omisión de la propiedad de juego de caracteres es heredado. Es posible cancelar una propiedad o un descriptor heredado declarándolo de nuevo con una serie vacía como valor.

Asociaciones de archivos adicionales

Pueden añadirse nuevas asociaciones de archivos a los tipos de contenido existentes. Por ejemplo, el conector Resources asocia org.eclipse.core.runtime.xml a archivos ".project":

	<extension point="org.eclipse.core.runtime.contentTypes">
	<file-association content-type="org.eclipse.core.runtime.xml" file-names=".project"/>
	...

Alias de tipo de contenido

A causa de la naturaleza ampliable de Eclipse, un tipo de contenido en el que se basa un conector puede no estar disponible en una configuración de producto determinada. Este problema puede eludirse utilizando alias de tipo de contenido. Un alias de tipo de contenido es una reserva de espacio para otro tipo de contenido preferido cuya disponibilidad no estaba garantizada. Por ejemplo, el entorno de ejecución declara un alias (org.eclipse.core.runtime.properties) para el tipo de contenido de propiedades Java proporcionado por JDT (Java Development Tooling) (org.eclipse.jdt.core.javaProperties):

<!-- reserva de espacio para configuraciones en que el tipo oficial de JDT no está disponible -->			
<content-type id="properties" name="%propertiesContentTypeName"
base-type="org.eclipse.core.runtime.text"
alias-for="org.eclipse.jdt.core.javaProperties"
file-extensions="properties">
<property name="charset" default="ISO-8859-1"/>
</content-type>

Esto proporciona conectores con una reserva de espacio a la que pueden hacer referencia independientemente de si el tipo de contenido está disponible o no. Si lo está, el tipo de contenido de alias se suprime del catálogo de tipo de contenido y las referencias al mismo se interpretan como referencias al tipo de contenido de destino. En caso contrario, el alias se utilizará como tipo de contenido ordinario.