La piattaforma definisce alcuni tipi di contenuto fondamentali, quali testo normale e XML. Questi tipi di contenuto sono definiti nello stesso modo dei tipi di contenuto forniti da altri plugin. Per comprendere meglio il framework del tipo di contenuto, verrà esaminato il modo il cui la piattaforma definisce i tipi di contenuto.
I plugin definiscono i tipi di contenuto fornendo un'estensione per il punto di estensione org.eclipse.core.runtime.contentTypes.
In questa estensione, un plugin specifica un id semplice e un nome per il tipo di contenuto (l'id completo è
costituito dall'id semplice prefissato dallo spazio nomi corrente).
Il seguente frammento mostra una versione ridotta del contributo al tipo di contenuto 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> ...
L'attributo file-extensions
definisce quali estensioni file sono associate al tipo di
contenuto (in questo esempio, ".txt"). L'attributo file-names
(non utilizzato in
questo caso) consente di associare nomi completi. Entrambi gli attributi sono gestiti dalla piattaforma
quando si esegue il rilevamento del tipo di contenuto e la descrizione (se il client fornisce un
nome file).
L'elemento describer
viene utilizzato per definire un descrittore di contenuto
per il tipo di contenuto.
Un tipo di contenuto deve fornire un descrittore di contenuto se sono presenti caratteristiche
identificabili che consentono il rilevamento automatico del tipo di contenuto, oppure altre proprietà
rilevanti nei dati che appartengono al tipo di contenuto. Nel caso di org.eclipse.core.runtime.text
,
non è possibile individuare il tipo di contenuto semplicemente osservando il contenuto.
Tuttavia, i flussi di testo possono essere preceduti da un BOM (Byte Order Mark), che è una
proprietà rilevante per i client, quindi questo giustifica un descrittore di contenuto.
Il descrittore è un'implementazione di IContentDescriber o ITextContentDescriber. Quest'ultimo è una specializzazione del primo, che deve essere implementata dai descrittori dei tipi di contenuto orientati al testo. Qualsiasi sia la natura del tipo di contenuto, i descrittori hanno due responsabilità: aiutare a determinare se il tipo di contenuto è appropriato per un flusso di dati fornito ed estrarre le proprietà rilevanti da un flusso di dati che si suppone appartenga al tipo di contenuto.
Il metodo describe(stream, description) viene richiamato quando la piattaforma cerca di determinare
il tipo di contenuto per un particolare flusso di dati o di descrivere il contenuto. La descrizione è
null
quando è richiesto solo il rilevamento.
Altrimenti,il descrittore dovrebbe cercare di valorizzare la descrizione del contenuto con le
proprietà che si possono individuare leggendo il flusso, e solo quelle.
Il tag del tipo di contenuto deve essere utilizzato per dichiarare le proprietà che hanno valori
predefiniti (ad esempio, org.eclipse.core.runtime.xml
dichiara UTF-8
come charset predefinito).
Quando esegue la sua attività, ci si aspetta che il descrittore di contenuto sia veloce. È meglio se la quantità di dati nel flusso è limitata. Inoltre, ci si aspetta che l'implementazione del descrittore di contenuto sia dichiarata in un pacchetto a cui non si applica l'attivazione del plugin (fare riferimento all'intestazione manifest dell'insieme Eclipse-AutoStart). Dal momento che tutti i descrittori sono istanziati quando si inizializza il framework del tipo di contenuto, una mancanza di rispetto dei requisiti provoca un'attivazione prematura. Future implementazioni della piattaforma potrebbero rifiutare di istanziare i descrittori se questo determina l'attivazione del plugin corrispondente.
I tipi di contenuto sono gerarchici per natura. Ciò consente ai nuovi tipi di contenuto di sfruttare gli attributi o il comportamento di tipi di contenuto più generali. Ad esempio, un tipo di contenuto per i dati XML viene considerato un elemento secondario del tipo di contenuto testo:
<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>
Un file XML viene considerato una specie di file di testo, quindi le funzioni applicabili a quest'ultimo sono valide anche per il primo.
Notare che il tipo di contenuto XML sovrascrive numerosi attributi del tipo di contenuto
originariamente definiti nel tipo di contenuto testo, quali le associazioni di file
e l'implementazione del descrittore. Inoltre, questo tipo di contenuto dichiara un valore proprietà
predefinito per la proprietà charset
. Questo indica che durante la descrizione del contenuto per
un flusso di dati considerato come appartenente al tipo di contenuto XML, se il descrittore non valorizza la
proprietà charset, la piattaforma lo imposterà a "UTF-8".
Come ulteriore esempio, il tipo di contenuto org.eclipse.ant.core.antBuildFile
(per gli
script di generazione Ant) estende il tipo di contenuto 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>
Notare che il valore predefinito per la proprietà charset è ereditato. È possibile annullare una proprietà o un descrittore ereditato effettuando una nuova dichiarazione con una stringa vuota come valore.
È possibile aggiungere nuove associazioni di file a tipi di contenuto esistenti. Ad esempio, il
plugin delle risorse associa org.eclipse.core.runtime.xml
ai file ".project":
<extension point="org.eclipse.core.runtime.contentTypes"> <file-association content-type="org.eclipse.core.runtime.xml" file-names=".project"/> ...
A causa della natura estensibile di Eclipse, un tipo di contenuto su cui si basa un plugin
potrebbe non essere disponibile nella configurazione del prodotto fornita. Il problema può essere aggirato
utilizzando alias del tipo di contenuto. Un alias del tipo di contenuto è un segnaposto per un
altro tipo di contenuto preferito la cui disponibilità non è garantita. Ad esempio, il Runtime
dichiara un alias (org.eclipse.core.runtime.properties
)
per il tipo di contenuto proprietà Java fornito da Java Development
Tooling (org.eclipse.jdt.core.javaProperties
):
<!-- a placeholder for setups where JDT's official type is not available -->
<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>
Questo fornisce plugin con un segnaposto a cui si può fare riferimento sia che il tipo di contenuto preferito sia disponibile o meno. Se è disponibile, il tipo di contenuto alias viene eliminato dal catalogo dei tipi di contenuto e tutti i riferimenti ad esso sono interpretati come riferimenti al tipo di contenuto di destinazione. Se non è disponibile, l'alias verrà utilizzato come tipo di contenuto ordinario.