A plataforma define alguns tipos de conteúdo fundamentais como, por exemplo, texto simples e XML. Estes tipos de conteúdo são definidos da mesma maneira que os contributos de outros plug-ins. Veremos como a plataforma define alguns dos seus tipos de conteúdo para melhor compreendermos o quadro de tipos de conteúdo.
Os plug-ins definem tipos de conteúdo mediante contributo de uma extensão para o ponto de extensão org.eclipse.core.runtime.contentTypes. Nesta extensão, um plug-in especifica um simples ID e nome para o tipo de conteúdo (o ID completo é sempre o ID simples com prefixo do actual espaço de nome). A porção de código seguinte mostra uma versão despojada do contributo de tipo de conteúdo do plug-in 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 as extensões de ficheiros associadas ao tipo de conteúdo (neste exemplo, ".txt"). O atributo file-names
(não usado neste caso) permite associar nomes completos. Ambos os atributos são tidos em consideração pela plataforma, ao realizar detecção e descrição de tipo de conteúdo (se o cliente facultar um nome de ficheiro).
O elemento describer
é utilizado para definir um descritor de conteúdo para o tipo de conteúdo.
Um tipo de conteúdo deve definir um descritor de conteúdo se houver características identificáveis que permitam a detecção automática de tipos de conteúdo ou propriedades interessantes em dados pertencentes ao tipo de conteúdo. No caso de org.eclipse.core.runtime.text
,
não é possível descortinar o tipo de conteúdo só por ver o conteúdo.
Todavia, as sequências de texto poderão ser #prepended por umamarca de ordem de bytes, a qual é uma propriedade que os clientes poderão estar interessados em conhecer, de modo que isto viabiliza um descritor de conteúdo.
O descritor é uma implementação do IContentDescriber ou ITextContentDescriber. Este último é uma especialização do primeiro que deve ser implementada por descritores de tipos de conteúdo orientados por texto. Seja qual for a natureza do tipo de conteúdo, o descritor tem duas responsabilidades: ajudar a determinar se o seu tipo de conteúdo é apropriado para certa sequência de dados, e extrair propriedades interessantes de uma sequência de dados que presumivelmente pertença ao seu tipo de conteúdo.
O método describe(stream, description) é chamado sempre que a plataforma tente determinar o tipo de conteúdo de certa sequência de dados ou descrever o respectivo conteúdo. A descrição é null
quando só for solicitada detecção. Caso contrário, o descritor deve tentar preencher a descrição de conteúdo com as propriedades que puder encontrar lendo a sequência, e só essas. A marcação do tipo de conteúdo deve ser usada para declarar as propriedades que tenham valores predefinidos (por exemplo, org.eclipse.core.runtime.xml
declara UTF-8 como conjunto de caracteres predefinido).
Quando desempenha o seu dever, espera-se que o descritor de conteúdo se execute o mais rápido possível. Quanto menos a sequência de dados tiver de ser lida, melhor. Além disso, espera-se que a implementação do descritor de conteúdo seja declarada num pacote que seja isento de activação de plug-in (consulte o cabeçalho do manifesto agrupamento Eclipse-AutoStart). Dado que todos os descritores são instanciados quando o quadro de tipo de conteúdo é inicializado, se este requisito não for cumprido haverá activação prematura, o que deve ser evitado. As futuras implementações da plataforma poderão recusar-se a instanciar descritores se ao fazê-lo for desencadeada a activação do plug-in correspondente.
Os tipos de conteúdo são hierárquicos por natureza. Assim se permite a novos tipos de conteúdo tirarem partido dos atributos ou do comportamento de tipos de conteúdo mais genéricos. Por exemplo, um tipo de conteúdo dados XML é considerado descendente do tipo de conteú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 ficheiro XML é considerado uma espécie de ficheiro de texto, de modo que as funções aplicáveis ao segundo devem ser aplicáveis ao primeiro também.
Repare que o tipo de conteúdo XML se sobrepõe a vários atributos de tipos de conteúdo originalmente definidos no tipo de conteúdo Texto como, por exemplo, as associações de ficheiros e a implementação do descritor. Além disso, este tipo de conteúdo declara um valor de propriedade predefinido para a propriedade charset
. Significa isto que durante a descrição do conteúdo de uma sequência de dados considerada pertencente ao tipo de conteúdo XML, se o descritor não preencher a propriedade charset (conjunto de caracteres), a plataforma define-a como "UTF-8".
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>
Repare que o valor predefinido para a propriedade charset é herdado. É possível cancelar uma propriedade ou um descritor herdado(a) redeclarando-o(a) com a cadeia de caracteres vazia como valor.
É possível adicionar novas associações de ficheiros aos tipos de conteúdo existentes. Por exemplo, o plug-in de recursos associa org.eclipse.core.runtime.xml
a ficheiros ".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 de que um plug-in dependa poderá não estar disponível em determinada configuração de produto. Tal poderá ser contornado constituindo nomes alternativos de tipos de conteúdo. Um nome alternativo de tipo de conteúdo é um marcador de lugar para outro tipo de conteúdo preferencial cuja disponibilidade não está garantida. Por exemplo, o Tempo de Execução declara um nome alternativo (org.eclipse.core.runtime.properties
)
para o tipo de conteúdo das propriedades Java facultadas pela Java Development Tooling
(org.eclipse.jdt.core.javaProperties
):
<!-- marcador de lugar para configurações em que o tipo oficial das JDT não esteja 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>
Assim se facultam, plug-ins com um marcador de lugar para o qual podem remeter, quer o tipo de conteúdo preferencial esteja disponível quer não. Se o estiver, o tipo de conteúdo alternativo é suprimido do catálogo de tipos de conteúdo e as eventuais referências ao mesmo são interpretadas como sendo ao tipo de conteúdo destino. Se não estiver disponível, será usado o nome alternativo como tipo de conteúdo vulgar.