El paquete org.eclipse.core.runtime.content proporciona soporte para definir tipos de contenido para corrientes de datos. Los tipos de contenido son utilizados por varias funciones de Eclipse sensibles al contenido, como por ejemplo la determinación de codificación automática, la selección de editor de comparación y las adiciones de menú. Un registro central de contenido gestionado por un IContentTypeManager permite a los conectores definir los tipos de contenido y especificar una clase que sea capaz de leer y describir el contenido. Para añadir tipos de contenido, es necesario un conocimiento básico de la infraestructura del contenido.
Nota: en esta descripción, se evita deliberadamente el uso de la palabra archivo al hablar del contenido. El motor de contenido del entorno de ejecución no presupone que el contenido se encuentre en un archivo del sistema de archivos. Sin embargo, no incluye ningún protocolo que permita asociar los tipos de contenido con patrones de denominación de archivos. En la práctica, estos nombres de archivo representan archivos del sistema de archivos, pero nada en la implementación del sistema de contenido presupone que el contenido se encuentre en el sistema de archivos. La sección Codificación de archivos y tipos de contenido describe los tipos de contenido orientados a archivos añadidos por el conector de recursos de la plataforma.
La plataforma define algunos tipos fundamentales de contenido, como por ejemplo las corrientes de datos de texto plano y XML. Estos tipos de contenido se definen del mismo modo que los añadidos por otros conectores. Observaremos el modo en que la plataforma define el tipo de contenido de texto 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 y un nombre para el tipo de contenido, y un IContentDescriber que puede leer una corriente de entrada y suministrar una descripción del contenido. El siguiente fragmento de código es la contribución del conector de entorno de ejecución para el tipo de contenido de texto:
<extension point="org.eclipse.core.runtime.contentTypes"> <content-type id="text" name="%textContentTypeName"> priority="high" file-extensions="txt"> <describer class="org.eclipse.core.internal.content.TextContentDescriber"/> </content-type> ...
TextContentDescriber es responsable de leer una corriente de entrada y determinar con rapidez si el contenido suministrado es un ejemplo de texto válido. Se llama al método describe(inputStream, description) cuando la plataforma intenta determinar el contenido de una corriente de datos determinada. IContentDescriber es responsable de determinar con rapidez si el contenido representa un ejemplo válido para su tipo de contenido y de devolver una constante que indique si el contenido coincide con su tipo. Si el contenido no coincide con su tipo, el descriptor también debe rellenar la IContentDescription suministrada con información acerca de los datos.
IContentDescription almacena los atributos específicos del contenido en pares formados por clave/valor. Estos atributos son específicos del tipo de contenido en particular. La plataforma especifica atributos para el juego de caracteres y el orden de los bytes de un archivo de texto, pero pueden definirse otros.
IContentTypeManager define el protocolo del registro de contenido. Los clientes pueden utilizar esta clase para probar una corriente de contenido o para obtener información acerca de otros tipos de contenido del sistema.
Los tipos de contenido están representados por IContentType. Esta clase representa un tipo de contenido exclusivo que es capaz de leer una corriente de datos e interpretar información específica del tipo de contenido. Los tipos de contenido son de naturaleza jerárquica. 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="text" priority="high" file-extensions="xml" default-charset="UTF-8"> <describer class="org.eclipse.core.internal.content.XMLContentDescriber"/> </content-type>
Esto permite a los tipos de contenido nuevos aprovechar los atributos o el comportamiento de tipos de contenido más generales.
El tipo de contenido de texto de plataforma no define un juego de caracteres para el contenido de texto. Los hijos del tipo de contenido de texto son libres de especificar juegos de caracteres por omisión diferentes cuando sea adecuado, al igual que hace el tipo de contenido XML. El juego de caracteres por omisión para corrientes XML es UTF-8, lo que significa que, cuando un archivo XML no tiene indicada explícitamente su codificación en su contenido, se considerará UTF-8.
Puede suceder que dos conectores independientes añadan un tipo de contenido para la misma clase de contenido. En este caso, la plataforma seleccionará sólo un descriptor de contenido para el contenido. El descriptor seleccionado se determina mediante un atributo priority que puede especificarse en la extensión contentTypes. Si dos conectores añaden un tipo de contenido para el mismo contenido con la misma prioridad, no podrá determinarse qué descriptor de contenido se seleccionará. Sin embargo, una vez seleccionado un descriptor de contenido, todas las referencias de registro al descriptor de contenido "perdedor" recibirán el alias del elegido.