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.
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.
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.
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"/> ...
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.