Il pacchetto org.eclipse.core.runtime.content fornisce il supporto per la definizione dei tipi di contenuto per i flussi di dati. I tipi di contenuto vengono utilizzati da varie funzioni sensibili al contesto di Eclipse, quali la determinazione della codifica automatica, la selezione dell'editor di confronto e le aggiunte ai menu. Un registro di contenuto centrale gestito da un IContentTypeManager consente ai plugin di definire i tipi di contenuto e di specificare una classe per la lettura e la descrizione del contenuto. Per aggiungere tipi di contenuto, è necessaria una conoscenza base del framework del contenuto.
Nota: per questo argomento, in genere si evita di utilizzare la parola file quando si parla di contenuto. Il motore del contenuto di runtime non presuppone che il contenuto si trovi in un file del file system. Tuttavia, tale motore include il protocollo che consente di associare i tipi di contenuto con modelli di denominazione file. In pratica, questi nomi file rappresentano i file del file system, ma nulla nell'implementazione del sistema del contenuto lascia presupporre che il contenuto si trovi nel file system. Nella sezione Codifica file e tipi di contenuto vengono illustrati i tipi di contenuto orientati ai file, forniti dal plugin delle risorse della piattaforma.
La piattaforma definisce alcuni tipi di contenuto fondamentali, quali il testo normale e i flussi di dati 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 il tipo di contenuto testo.
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 e un nome per il tipo di contenuto e un IContentDescriber, in grado di leggere un flusso di input e di fornire una descrizione del contenuto. Il frammento di seguito riportato rappresenta il contributo del plugin di runtime per il tipo di contenuto testo:
<extension point="org.eclipse.core.runtime.contentTypes"> <content-type id="text" name="%textContentTypeName"> priority="high" file-extensions="txt"> <describer class="org.eclipse.core.internal.content.TextContentDescriber"/> </content-type> ...
TextContentDescriber è responsabile della lettura di un flusso di input e della determinazione rapida del fatto che il contenuto fornito sia un valido esempio di testo. Il metodo describe(inputStream, description) viene richiamato ogni volta che la piattaforma tenta di stabilire il contenuto di un determinato flusso di dati. IContentDescriber è responsabile della determinazione rapida del fatto che il contenuto rappresenti un valido esempio del tipo di contenuto e restituisca una costante che indichi se il contenuto corrisponde al relativo tipo. Se il contenuto non corrisponde al relativo tipo, il descrittore deve inserire nel IContentDescription fornito le informazioni sui dati.
IContentDescription memorizza gli attributi specifici del contenuto in coppie chiave/valore. Questi attributi sono specifici del particolare tipo di contenuto. La piattaforma specifica gli attributi per l'insieme di caratteri e l'ordine di byte di un file di testo, ma possono essere definiti anche altri attributi.
IContentTypeManager definisce il protocollo per il registro del contenuto. I client possono utilizzare questa classe per verificare un flusso di contenuto o per individuare informazioni sugli altri tipi di contenuto del sistema.
I tipi di contenuto sono rappresentati da IContentType. Questa classe rappresenta un tipo di contenuto univoco, in grado di leggere un flusso di dati e di interpretare informazioni specifiche del tipo di contenuto. I tipi di contenuto sono gerarchici per natura. 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="text" priority="high" file-extensions="xml" default-charset="UTF-8"> <describer class="org.eclipse.core.internal.content.XMLContentDescriber"/> </content-type>
Ciò consente ai nuovi tipi di contenuto di appoggiare gli attributi o il comportamento di tipi di contenuto più generali.
Il tipo di contenuto testo della piattaforma non definisce un insieme di caratteri per il contenuto testo. Gli elementi secondari del tipo di contenuto testo sono liberi di specificare insiemi di caratteri predefiniti diversi, quando appropriato, come il tipo di contenuto XML. L'insieme di caratteri predefinito per i flussi XML è UTF-8, che indica che un file XML non dispone di una codifica esplicitamente definita nel relativo contenuto, ma che la codifica verrà stabilita come UTF-8.
È concepibile che due plugin indipendenti forniscano un tipo di contenuto per lo stesso genere di contenuto. In questo caso, la piattaforma seleziona solo il descrittore di un contenuto. Il descrittore selezionato viene determinato utilizzando un attributo priority che può essere specificato nell'estensione contentTypes. Se due plugin forniscono un tipo di contenuto per lo stesso contenuto con la stessa priorità, non è possibile determinare il descrittore di contenuto che verrà selezionato. Una volta selezionato il descrittore di contenuto, tuttavia, tutti i riferimenti di registro al descrittore di contenuto "non selezionato" verranno inseriti come alias nel descrittore selezionato.