Nota: Para esta abordagem, evitamos especificamente o uso do termo ficheiro relativamente a conteúdo. O motor de conteúdo de tempo de execução não presume que o conteúdo esteja contido em ficheiros no sistema de ficheiros. Todavia, inclui protocolo que permite associação de tipos de conteúdo com padrões de nomenclatura de ficheiros. Na prática, estes nomes de ficheiros representam ficheiros no sistema de ficheiros, mas nada na implementação do conteúdo indica que este se encontre no sistema de ficheiros. Codificação de ficheiros e tipos de conteúdo aborda as capacidades de tipos de conteúdo orientados para ficheiros que são contributos do plug-in de recursos da plataforma e é de leitura obrigatória para programadores interessados em utilizar a API de tipos de conteúdo nesse contexto.
Os tipos de conteúdo são representados por IContentType. Esta interface representa um tipo de conteúdo único que sabe como ler uma sequência de dados e interpretar informações específicas de tipos de conteúdo. Os tipos de conteúdo são hierárquicos por natureza. Por exemplo, um tipo de conteúdo dados XML é considerado descendente do tipo de conteúdo texto. Assim se permite a novos tipos de conteúdo tirarem partido dos atributos ou do comportamento de tipos de conteúdo mais genéricos.
O IContentTypeManager é o ponto de entrada que dá acesso à maioria da API relacionada com tipos de conteúdo facultada pelo tempo de execução da plataforma. Para obter uma referência ao IContentTypeManager da plataforma, os clientes podem utilizar a API Platform:
IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
Os clientes podem utilizar o IContentTypeManager da plataforma para conhecer os tipos de conteúdo no sistema.
Perante uma sequência de bytes, é possível determinar o seu tipo de conteúdo chamando a API IContentTypeManager como se segue:
InputStream stream = ...; IContentType contentType = contentTypeManager.findContentTypeFor(stream, "file.xml"); stream.close();
Isto devolve o IContentType mais apropriado perante a entrada de dados indicada ou null
se nenhuma for detectada. Podem ser considerados apropriados vários tipos de conteúdo para determinada sequência de dados. Nesse caso, a plataforma utiliza heurística para determinar qual deve ser seleccionado. O nome de ficheiro é o primeiro critério na selecção de tipos de conteúdo. Pode ser omitido, mas há duas questões: os resultados podem não estar correctos por haver muitos tipos de conteúdo não relacionados a aceitar a mesma entrada de dados; existe também um grande impacto no rendimento, dado que todos os tipos de conteúdo na plataforma têm que ter hipótese de analisar a sequência. Por conseguinte, a menos que não esteja disponível, os clientes devem facultar sempre um nome de ficheiro junto com a sequência.
Outra característica interessante do suporte de tipos de conteúdo na plataforma é a capacidade de descrever o conteúdo de uma sequência binária ou de caracteres. A porção de código seguinte mostra como o fazer:
InputStream stream = ...; IContentDescription description = contentTypeManager.getDescriptionFor(stream, "file.xml"); stream.close();
A instância de IContentDescription devolvida descreve o tipo de conteúdo e informações adicionais relevantes extraídas do conteúdo indicado. A descrição de conteúdo armazena propriedades específicas de conteúdo sob forma de pares chave/valor. A própria plataforma é capaz de descrever propriedades como, por exemplo, o conjunto de caracteres e a ordem de bytes de sequências baseadas em texto, mas podem ser definidas outras pelos fornecedores de tipos de conteúdo.
Os novos tipos de conteúdo geralmente são definidos como especialização dos existentes. Esta hierarquia estabelece uma relação "é um" entre um tipo de conteúdo derivado e o seu tipo base. Os programadores de plug-ins devem respeitar isto ao implementar funções dependentes de conteúdo. Se dada função for aplicável a dado tipo de conteúdo, a função deve ser aplicável a quaisquer tipos de conteúdo derivados também. O método IContentType.isKindOf(IContentType superType) permite determinar se dois IContentTypes são ou não relacionados. O método IContentType.getBaseType() permitedeterminar o tipo base de certo IContentType.