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.
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.
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.
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"/> ...
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.