Nota: Para esta discussão, evitamos especificamente o uso da palavra arquivo ao conversar sobre conteúdo. O mecanismo de conteúdo do tempo de execução não supõe que o conteúdo esteja contido em um arquivo no sistema de arquivos. No entanto, inclui um protocolo que permite que os tipos de conteúdo estejam associados aos padrões de nomeação do arquivo. Na prática, esses nomes de arquivo representam arquivos no sistema de arquivos, mas nada na implementação do sistema de conteúdo supõe que o conteúdo esteja localizado no sistema de arquivos. A Codificação do Arquivo e os Tipos de Conteúdo discutem os tipos de conteúdo orientados pelo arquivo contribuído pelo plug-in dos recursos da plataforma e são uma leitura necessária para os desenvolvedores interessados na utilização da API de tipo de conteúdo neste contexto.
Os tipos de conteúdo são representados por IContentType. Essa interface representa um tipo de conteúdo exclusivo que sabe como ler um fluxo de dados e interpretar as informações específicas do tipo de conteúdo. Os tipos de conteúdo são hierárquicos por natureza. Por exemplo, um tipo de conteúdo para dados XML é considerado um filho do tipo de conteúdo do texto. Isso permite que novos tipos de conteúdo alavanquem os atributos ou o comportamento de tipos de conteúdo mais gerais.
O IContentTypeManager é um ponto de entrada que fornece acesso à maioria das APIs relacionadas do tipo de conteúdo fornecidas pelo tempo de execução da plataforma. Para obter uma referência à plataforma IContentTypeManager, os clientes podem utilizar a API da Plataforma:
IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
Os clientes podem utilizar a plataforma IContentTypeManager para saber sobre os tipos de conteúdos no sistema.
Determinado um fluxo de bytes, é possível determinar o tipo de conteúdo chamando a API IContentTypeManager da seguinte maneira:
InputStream stream = ...; IContentType contentType = contentTypeManager.findContentTypeFor(stream, "file.xml"); stream.close();
Isso retornará a IContentType mais apropriada
determinada a entrada fornecida ou null
se nenhuma puder ser localizada. Vários
tipos de conteúdo podem ser considerados apropriados para um determinado fluxo de dados. Nesse caso,
a plataforma utiliza alguma heurística para determinar qual deles deve ser selecionado.
O nome do arquivo é o primeiro critério pelo qual os tipos de conteúdo são selecionados. Ele
pode ser omitido, mas possui dois problemas: os resultados podem não estar tão corretos
porque muitos tipos de conteúdo não relacionados podem aceitar a mesma entrada; há também
uma grande ocorrência de desempenho, visto que é preciso ser dada uma oportunidade de análise de fluxo
a todos os tipos de conteúdo na plataforma. Portanto, a não ser que indisponível, os clientes sempre
devem fornecer um nome de arquivo juntamente com o fluxo.
Outro recurso interessante do suporte de tipo de conteúdo na plataforma é a capacidade de descrever o conteúdo de um fluxo binário ou de caractere. O seguinte trecho de código mostra como fazer isso:
InputStream stream = ...; IContentDescription description = contentTypeManager.getDescriptionFor(stream, "file.xml"); stream.close();
A instância IContentDescription retornada descreve o tipo de conteúdo e as informações relevantes adicionais extraídas do conteúdo fornecido. A descrição de conteúdo armazena as propriedades específicas de conteúdo no formulário de pares de chave/valor. A própria plataforma consegue descrever as propriedades, como por exemplo o conjunto de caracteres e o pedido de byte de fluxos baseados em texto, mas outras podem ser definidas pelos provedores de tipo de conteúdo.
Os novos tipos de conteúdo são freqüentemente definidos como especialização daqueles existentes. Essa hierarquia estabelece um relacionamento "is a" entre um tipo de conteúdo derivado e seu tipo de base. Os desenvolvedores de plug-in devem aceitar isso ao implementar os recursos sensíveis ao conteúdo. Se um recurso determinado for aplicável a um determinado tipo de conteúdo, o recurso também deverá ser aplicável a quaisquer tipos de conteúdos derivados. O método IContentType.isKindOf(IContentType superType) permite determinar se dois IContentTypes estão relacionados. O método IContentType.getBaseType() permite determinar o tipo de base de um IContentType determinado.