Nota: all'interno di questo argomento, è stato evitato in modo specifico di utilizzare la parola file per indicare il 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 illustrate le funzioni dei tipi di contenuto orientati ai file, forniti dal plugin delle risorse della piattaforma; questa sezione deve essere letta con attenzione dagli sviluppatori interessati all'utilizzo di API dei tipi di contenuto in questo contesto.
I tipi di contenuto sono rappresentati da IContentType. Questa interfaccia 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. Ciò consente ai nuovi tipi di contenuto di sfruttare gli attributi o il comportamento di tipi di contenuto più generali.
IContentTypeManager è un punto di ingresso che fornisce accesso alla maggior parte delle API relative ai tipi di contenuto fornite dal runtime della piattaforma. Per ottenere un riferimento al IContentTypeManager della piattaforma, i client possono utilizzare l'API di piattaforma:
IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
I client possono utilizzare il IContentTypeManager della piattaforma per avere informazioni sui tipi di contenuto del sistema.
Dato un flusso di byte, è possibile determinare il suo tipo di contenuto richiamando l'API IContentTypeManager nel modo seguente:
InputStream stream = ...; IContentType contentType = contentTypeManager.findContentTypeFor(stream, "file.xml"); stream.close();
Questo restituirà il
IContentType
più appropriato all'input fornito o null
se non viene trovato. Per un flusso di dati fornito è
possibile che possano essere stabiliti più tipi di contenuto appropriati. In tal caso, la piattaforma
utilizza criteri euristici per determinare quale tipo selezionare.
Il nome file è il primo criterio in base al quale viene selezionato il tipo di contenuto. Il nome può essere
omesso, questo ha due controindicazioni: i risultati potrebbero non essere esatti in quanto molti tipi
di contenuto non correlati potrebbero accettare lo stesso input; si crea anche un problema di prestazioni,
dal momento che a tutti i tipi di contenuto presenti sulla piattaforma deve essere data la possibilità di
analizzare il flusso. Quindi, a meno che sia non disponibile, i client dovrebbero sempre fornite un nome
file insieme al flusso.
Un'altra interessante funzione del supporto dei tipi di contenuto nella piattaforma è nella capacità di descrivere il contenuto di un flusso binario o di un flusso di caratteri. Il seguente frammento di codice mostra come eseguire questa funzione:
InputStream stream = ...; IContentDescription description = contentTypeManager.getDescriptionFor(stream, "file.xml"); stream.close();
L'istanza IContentDescription restituita descrive il tipo di contenuto ed altre informazioni rilevanti estratte dal contenuto fornito. La descrizione del contenuto archivia proprietà specifiche del contenuto sotto forma di coppie di chiave/valore. La stessa piattaforma è in grado descrivere proprietà quali l'insieme di caratteri e l'ordine byte dei flussi basati su testo, ma altre possono essere definite dai fornitori del tipo di contenuto.
Nuovi tipi di contenuto vengono spesso definiti come specializzazione di tipi esistenti. Questa gerarchia stabilisce una relazione "is a" tra un tipo di contenuto derivato e il relativo tipo di base. Gli sviluppatori di plugin devono considerare ciò quando implementano funzioni sensibili al contesto. Se una determinata funzione è applicabile ad un tipo di contenuto, la funzione deve essere applicabile anche ai tipi di contenuto derivati. Il metodo IContentType.isKindOf(IContentType superType) consente di determinare se due IContentType sono in relazione tra loro. Il metodo IContentType.getBaseType() consente di determinare il tipo di base di un IContentType fornito.