Aggiunta di tipi di contenuto

Nuovo tipo di contenuto

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.

Rilevamento e descrizione del 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.

Estensione di un tipo di contenuto esistente

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.

Ulteriori associazioni di file

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

Alias del tipo di contenuto

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.