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 aportados por el conector de recursos de la plataforma y es de lectura obligatoria para los desarrolladores que estén interesados en usar la API de tipos de contenido en ese contexto.
Los tipos de contenido están representados por IContentType. Esta clase representa un tipo de contenido exclusivo que sabe 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. Esto permite a los tipos de contenido nuevos aprovechar los atributos o el comportamiento de tipos de contenido más generales.
IContentTypeManager es el punto de entrada que da acceso a la mayor parte de la API relacionada con tipos de contenido que suministra la ejecución de la plataforma. Para obtener una referencia a la plataforma IContentTypeManager, los clientes pueden utilizar la API Platform:
IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
Los clientes pueden utilizar la plataforma IContentTypeManager para averiguar los tipos de contenido del sistema.
Dada una corriente de bytes, es posible determinar su tipo de contenido llamando a la API IContentTypeManager de la manera siguiente:
InputStream stream = ...; IContentType contentType = contentTypeManager.findContentTypeFor(stream, "file.xml"); stream.close();
Esto devolverá el
IContentType
más adecuado teniendo en cuenta la entrada suministrada, o null
si
no se ha encontrado ninguno.
Varios tipos de contenido pueden considerarse adecuados para una corriente de
datos determinada.
En este caso, la plataforma utiliza una heurística para determinar cuál de
ellos debe seleccionarse.
El nombre de archivo es el primer criterio por el que se seleccionan los tipos
de contenido. Puede omitirse, pero tiene dos problemas: puede que los
resultados no sean tan correctos porque muchos tipos de contenido no
relacionados pueden aceptar la misma entrada; también hay un impacto importante
en el rendimiento, ya que se debe dar a todos los tipos de contenido de la
plataforma la oportunidad de analizar la corriente.
Así, salvo que no esté disponible, los clientes deben proporcionar siempre un
nombre de archivo junto con la corriente.
Otra característica interesante del soporte de tipo de contenido en la plataforma es la capacidad de describir el contenido de una corriente binaria o de caracteres. El siguiente fragmento de código muestra cómo hacerlo:
InputStream stream = ...; IContentDescription description = contentTypeManager.getDescriptionFor(stream, "file.xml"); stream.close();
La instancia de IContentDescription devuelta describe el tipo de contenido e información relevante adicional que se ha extraído del contenido suministrado. La descripción de contenido almacena las propiedades específicas del contenido en forma de pares de clave/valor. La propia plataforma puede describir propiedades tales como el juego de caracteres y el orden de los bytes de las corrientes basadas en texto, pero otras pueden definirlas los proveedores de tipo de contenido.
Los nuevos tipos de contenido suelen definirse como una especialización de los ya existentes. Esta jerarquía establece una relación "es un" entre un tipo de contenido derivado y su tipo base. Los desarrolladores de conectores deben tenerlo en cuenta cuando implementen características sensibles al contenido. Si una característica determinada es aplicable a un tipo de contenido dado, la característica debe ser aplicable también a los tipos de contenido derivados. El método IContentType.isKindOf(IContentType superType) permite determinar si dos IContentType están relacionados. El método IContentType.getBaseType() permite determinar el tipo base de un IContentType determinado.