Contribuindo com Tipos de Conteúdo

Fornecendo um Novo Tipo de Conteúdo

A plataforma define alguns tipos fundamentais de conteúdo, como texto corrido e XML. Esses tipos de conteúdo são definidos da mesma forma que os que são contribuídos por outros plug-ins. Observaremos como a plataforma define o tipo de conteúdo do texto para melhorar o entendimento da estrutura do tipo de conteúdo.

Os plug-ins definem os tipos de conteúdo, contribuindo com uma extensão para o ponto de extensão org.eclipse.core.runtime.contentTypes. Nessa extensão, um plug-in especifica um ID simples e nome para o tipo de conteúdo (o ID completo já é o ID simples prefixado pelo espaço de nomes atual). O fragmento a seguir mostra uma versão removida da contribuição de tipo de conteúdo do 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>
		...

O atributo file-extensions define quais extensões de arquivos estão associadas ao tipo de conteúdo (neste exemplo, ".txt"). O atributo file-names (não utilizado neste caso) permite associar nomes completos. Ambos os atributos são considerados pela plataforma, ao desempenhar a detecção e descrição de tipo de conteúdo (se o cliente fornecer um nome de arquivo).

O elemento describer é utilizado para definir um descritor de conteúdo para o tipo de conteúdo.

Detectando e Descrevendo o Conteúdo

Um tipo de conteúdo deve fornecer um descritor de conteúdo, se houver quaisquer características identificáveis que permitem a detecção de tipo de conteúdo automática ou quaisquer propriedades interessantes em dados pertencentes ao tipo de conteúdo. No caso do org.eclipse.core.runtime.text, não é possível calcular o tipo de conteúdo apenas observando o conteúdo. No entanto, os fluxos de textos podem ser incluídos por uma marca de pedido de byte, a qual é uma propriedade que os clientes podem estar interessados em conhecer, desta forma, isso garante um descritor de conteúdo.

O descritor é uma implementação do IContentDescriber ou ITextContentDescriber. O último é uma especialização do antigo que deve ser implementado por descritores de tipos de conteúdo orientados por texto. Independente da natureza do tipo de conteúdo, o descritor possui duas responsabilidades: ajudar a determinar se o tipo de conteúdo é apropriado para um determinado fluxo de dados e extrair as propriedades interessantes de um fluxo de dados que supostamente pertencem ao tipo de conteúdo.

O método describe(stream, description) é chamado sempre que a plataforma está tentando determinar o tipo de conteúdo para um fluxo de dados específico ou descrever seu conteúdo. A descrição é nula quando apenas a detecção é solicitada. Do contrário, o descritor deve tentar preencher a descrição do conteúdo com algumas propriedades que poderiam ser localizadas pela leitura do fluxo e apenas estas. A marcação de tipo de conteúdo deve ser utilizada para declarar todas as propriedades que têm valores padrão (por exemplo, org.eclipse.core.runtime.xml declara UTF-8 como o conjunto de caracteres padrão).

Ao desempenhar sua obrigação, espera-se que o descritor de conteúdo seja executado tão rápido quanto possível. Quanto menos for preciso ler o fluxo de dados, melhor. Além disso, espera-se que a implementação do descritor de conteúdo seja declarada em um pacote isento de ativação de plug-in (consulte o cabeçalho de manifesto do pacote configurável de Inicialização Automática do Eclipse). Como todos os descritores são instanciados quando a estrutura de tipo de conteúdo é inicializada, a falha na conformidade com esse requisito causa a ativação prematura, a qual deve ser evitada. As implementações futuras da plataforma podem recusar instanciar os descritores, se isso for feito, acionará a ativação do plug-in correspondente.

Estendendo um Tipo de Conteúdo Existente

Os tipos de conteúdo são hierárquicos por natureza. Isso permite que novos tipos de conteúdo alavanquem os atributos ou o comportamento de tipos de conteúdo mais gerais. Por exemplo, um tipo de conteúdo para dados XML é considerado um filho do tipo de conteúdo do 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>

Um arquivo XML é considerado um tipo de arquivo de texto, portanto, todos os recursos aplicáveis ao mais recente devem também ser aplicáveis ao antigo.

Observe que o tipo de conteúdo XML substitui os vários atributos de tipo de conteúdo originalmente definidos no tipo de conteúdo de Texto, como por exemplo as associações de arquivos e a implementação do descritor. Além disso, esse tipo de conteúdo declara um valor de propriedade padrão para a propriedade charset. Isso significa que durante a descrição de conteúdo para um fluxo de dados considerado como pertencente ao tipo de conteúdo XML, se o descritor não preencher a propriedade charset, a plataforma o configurará para ser "UTF-8".

Como outro exemplo, o tipo de conteúdo org.eclipse.ant.core.antBuildFile (para Scripts de Construção Ant) estende o tipo de conteúdo 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 o valor padrão para a propriedade charset é herdado. É possível cancelar uma propriedade ou descritor herdado, declarando-os novamente com a cadeia vazia como valor.

Associações de Arquivos Adicionais

Novas associações de arquivos podem ser incluídas em tipos de conteúdos existentes. Por exemplo, o plug-in Recursos associa o org.eclipse.core.runtime.xml aos arquivos ".project":

	<extension point="org.eclipse.core.runtime.contentTypes">
	<file-association content-type="org.eclipse.core.runtime.xml" file-names=".project"/>
	...

Alias de Tipo de Conteúdo

Devido à natureza extensível do Eclipse, um tipo de conteúdo com o qual conta um plug-in, pode não estar disponível em uma determinada configuração do produto. Isso pode ser solucionado utilizando o alias de tipo de conteúdo. Um alias de tipo de conteúdo é um sinalizador de substituição para outro tipo de conteúdo preferido, cuja disponibilidade não é garantida. Por exemplo, o Runtime declara um alias (org.eclipse.core.runtime.properties) para o tipo de conteúdo de propriedades do Java fornecido pelo Java Development Tooling (org.eclipse.jdt.core.javaProperties):

<!-- um sinalizador de substituição para configurações onde o tipo oficial do JDT não está disponível -->			
<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>

Isso fornece plug-ins com um sinalizador de substituição possíveis de serem referidos, independente do tipo de conteúdo disponível ou não. Se disponíveis, o tipo de conteúdo do alias é anulado do catálogo de tipo de conteúdo e todas as referências a ele são interpretadas como referências ao tipo de conteúdo de destino. Se não disponíveis, o alias será utilizado como um tipo de conteúdo comum.