Uwaga: W tej sekcji celowo unika się słowa plik, gdy mowa o treści. W mechanizmie treści środowiska wykonawczego nie zakłada się, że treść znajduje się w pliku w systemie plików. Mechanizm ten zawiera jednak protokół, który pozwala na powiązanie typów treści z wzorcami nazw plików. W praktyce nazwy te reprezentują pliki w systemie plików, ale w implementacji systemu treści nie ma elementów, które byłyby uzależnione od założenia, że treść znajduje się w systemie plików. W sekcji Kodowanie plików i typy treści omówiono typy treści zorientowane na pliki, które są dostarczane przez moduł dodatkowy zasobów platformy. Jest to lektura obowiązkowa dla programistów zainteresowanych używaniem w tym kontekście interfejsu API obsługującego typ treści.
Typy treści są reprezentowane przez interfejs IContentType. Interfejs ten reprezentuje unikalny typ treści, który umożliwia odczyt strumienia danych i interpretowanie informacji specyficznych dla danego typu treści. Typy treści mają naturę hierarchiczną. Przykładowo typ treści dla danych XML stanowi element potomny typu treści tekstowych. Dzięki temu nowe typy treści mogą korzystać z atrybutów lub zachowania typów bardziej ogólnych.
Interfejs IContentTypeManager jest punktem wejścia, który umożliwia dostęp do większości funkcji interfejsu API typu treści udostępnianych przez środowisko wykonawcze platformy. Aby uzyskać odwołanie do interfejsu IContentTypeManager platformy, klienci mogą używać funkcji API Platform:
IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
Klienci mogą używać interfejsu IContentTypeManager platformy do określenia typów treści dostępnych w systemie.
Dla danego strumienia bajtów można określić jego typ treści przez wywołanie funkcji API IContentTypeManager w następujący sposób:
InputStream stream = ...; IContentType contentType = contentTypeManager.findContentTypeFor(stream, "file.xml"); stream.close();
Zwrócony zostanie najbardziej odpowiedni dla udostępnionych danych wejściowych obiekt
IContentType lub wartość NULL
, jeśli nie zostanie znaleziony żaden typ. Dla danego strumienia danych wiele typów treści może zostać uznanych za odpowiednie. W takim przypadku platforma ustala typ za pomocą pewnych funkcji heurystycznych.
Nazwa pliku stanowi pierwsze kryterium, według którego są wybierane typy treści. To kryterium może zostać pominięte, ale wiążą się z tym pewne konsekwencje. Wyniki mogą być niepoprawne, ponieważ wiele niepowiązanych typów treści może akceptować te same dane wejściowe. Innym problemem może być duży spadek wydajności, ponieważ strumień musi być analizowany pod kątem wszystkich typów treści dostępnych na platformie. Jeśli istnieje taka możliwość, klienci powinni zawsze udostępniać nazwę pliku wraz ze strumieniem danych.
Inną interesującą funkcją związaną z obsługą typu treści przez platformę jest możliwość opisywania treści strumienia binarnego lub strumienia znaków. Poniższy fragment kodu pokazuje, w jaki sposób można to zrobić:
InputStream stream = ...; IContentDescription description = contentTypeManager.getDescriptionFor(stream, "file.xml"); stream.close();
Zwracana instancja IContentDescription zawiera opis typu treści i dodatkowe, istotne informacje wyodrębnione z udostępnionej treści. W opisie treści przechowywane są specyficzne dla treści właściwości w formie par klucz - wartość. Platforma może określać właściwości, takie jak zestaw znaków i kolejność bajtów w strumieniach tekstowych, a inne właściwości mogą być definiowane przez dostawców typów treści.
Nowe typy treści są często definiowane jako specjalizacje typów już istniejących. Taka hierarchia powoduje ustanowienie relacji "jest" między pochodnym typem treści i jego typem bazowym. Programiści, którzy tworzą moduły dodatkowe, muszą uwzględniać ten fakt podczas implementowania składników zależnych od treści. Jeśli dany składnik będzie zgodny z danym typem treści, musi być również zgodny ze wszystkimi pochodnymi typami treści. Metoda IContentType.isKindOf(IContentType superType) umożliwia określenie, czy dwa obiekty IContentType są sobie pokrewne. Metoda IContentType.getBaseType() umożliwia określenie typu bazowego danego obiektu IContentType.