Platforma definiuje kilka podstawowych typów treści, takich jak zwykły tekst czy dane XML. Te typy treści zostały zdefiniowane w taki sam sposób, jak typy dostarczane przez inne moduły dodatkowe. W dalszej części omówiony zostanie sposób, w jaki platforma definiuje niektóre typy treści, co umożliwi lepsze zrozumienie struktury typów treści.
Moduły dodatkowe definiują typy treści, dostarczając rozszerzenie dla punktu
rozszerzenia org.eclipse.core.runtime.contentTypes. W tym rozszerzeniu moduł dodatkowy określa prosty identyfikator i nazwę typu treści (pełny identyfikator składa się zawsze z prostego identyfikatora poprzedzonego bieżącą przestrzenią nazw).
Poniższy fragment kodu prezentuje skróconą wersję definicji typu treści 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> ...
Atrybut file-extensions
definiuje rozszerzenia powiązane z typem treści (w tym przykładzie jest to rozszerzenie ".txt"). Atrybut file-names
(nie używany w tym przykładzie) umożliwia powiązanie pełnych nazw. Obydwa atrybuty są uwzględniane przez platformę podczas wykonywania operacji wykrywania i opisywania typu treści (jeśli klient udostępnia nazwę pliku).
Element describer
służy do definiowania obiektu opisu treści dla tego typu treści.
Typ treści powinien udostępniać obiekt opisu treści, jeśli istnieją możliwe do zidentyfikowania parametry, które umożliwiają automatyczne wykrywanie typu treści, lub jakiekolwiek inne interesujące właściwości danych należących do tego typu treści. W przypadku interfejsu org.eclipse.core.runtime.text
nie ma możliwości określenia typu treści tylko na podstawie samej treści.
Przed strumieniami tekstu można jednak dodać znacznik kolejności bajtów. Ta właściwość może być interesująca dla klientów i stanowić obiekt opisu treści.
Obiekt opisu treści jest implementacją interfejsu IContentDescriber lub ITextContentDescriber. Drugi z tych interfejsów stanowi specjalizację pierwszego, który musi być implementowany przez obiekty opisu treści dla typów treści zorientowanych na tekst. Niezależnie od natury typu treści obiekt opisu treści jest odpowiedzialny za dwa elementy: pomoc w określeniu, czy jego typ treści jest odpowiedni dla danego strumienia danych i wyodrębnianie interesujących właściwości ze strumienia danych, które przypuszczalnie należą do jego typu treści.
Metoda describe(stream, description) jest wywoływana za każdym razem, gdy platforma próbuje określić typ treści wybranego strumienia danych lub opisać jego treść. Opis ma wartość NULL
, jeśli wymagane jest tylko wykrywanie.
W przeciwnym razie obiekt opisu treści powinien podjąć próbę wypełnienia opisu treści za pomocą dowolnych właściwości, które znajdzie podczas odczytu strumienia (i tylko takich). Znacznik typu treści powinien być używany do deklarowania dowolnych właściwości, które przyjmują domyślne wartości (na przykład interfejs org.eclipse.core.runtime.xml
deklaruje UTF-8 jako domyślną wartość właściwości charset).
Spodziewać się można, że operacje będą wykonywane przez obiekt opisu treści tak szybko, jak to jest możliwe. Im mniej danych ze strumienia będzie musiało być odczytanych, tym lepiej. Implementacja obiektu opisu treści powinna zostać zadeklarowana w pakiecie, który jest wyłączony z operacji aktywowania modułu dodatkowego (więcej informacji znajduje się w nagłówku manifestu pakunku Eclipse-AutoStart). Ponieważ wszystkie obiekty opisu treści są inicjowane wraz ze strukturą typów treści, niespełnienie tego wymagania spowoduje zbyt wczesną aktywację, czego należy unikać. Przyszłe implementacje platformy mogą odmówić utworzenia instancji obiektu opisu treści, jeśli miałoby to wyzwolić aktywację odpowiedniego modułu dodatkowego.
Typy treści mają naturę hierarchiczną. Dzięki temu nowe typy treści mogą korzystać z atrybutów lub zachowania typów bardziej ogólnych. Przykładowo typ treści dla danych XML stanowi element potomny tekstowego typu treści:
<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>
Plik XML jest uznawany za rodzaj pliku tekstowego, dlatego wszystkie funkcje dotyczące pliku tekstowego mają również zastosowanie do pliku XML.
Należy zauważyć, że typ treści strumienia danych XML przesłania kilka atrybutów oryginalnie zdefiniowanych w tekstowym typie treści, na przykład powiązania plików i implementację obiektu opisu treści. Ten typ treści deklaruje również domyślną wartość właściwości charset
. Oznacza to, że podczas opisywania treści strumienia danych, który należy do typu treści danych XML, właściwość charset zostanie ustawiona przez platformę na wartość "UTF-8", jeśli nie wypełni jej obiekt opisu treści.
W kolejnym przykładzie typ treści org.eclipse.ant.core.antBuildFile
(skrypty budowania programu Ant) rozszerza typ treści danych 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>
Należy zauważyć, że domyślna wartość właściwości charset jest dziedziczona. Można anulować dziedziczoną właściwość lub obiekt opisu treści przez powtórne ich zadeklarowanie, ustawiając wartość będącą pustym łańcuchem.
Do istniejących typów treści mogą być dodawane nowe powiązania plików. Przykładowo moduł dodatkowy obsługi zasobów tworzy powiązanie typu treści org.eclipse.core.runtime.xml
z plikami ".project":
<extension point="org.eclipse.core.runtime.contentTypes"> <file-association content-type="org.eclipse.core.runtime.xml" file-names=".project"/> ...
Ze względu na rozszerzalność środowiska Eclipse typ treści używany przez moduł dodatkowy może nie być dostępny w konfiguracji danego produktu. Problem ten można wyeliminować przy użyciu aliasów typów treści. Alias typu treści to obiekt zastępczy dla innego preferowanego typu treści, którego dostępność nie jest zagwarantowana. Przykładowo komponent Runtime deklaruje alias (org.eclipse.core.runtime.properties
) dla typu treści właściwości Java udostępnianego przez pakiet Java Development Tooling (org.eclipse.jdt.core.javaProperties
):
<!-- obiekt zastępczy dla konfiguracji w przypadku, gdy oficjalny typ pakietu JDT jest niedostępny -->
<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>
Powoduje to udostępnienie obiektu zastępczego, do którego może odwoływać się moduł dodatkowy niezależnie od tego, czy preferowany typ treści jest dostępny czy nie. Jeśli preferowany typ treści jest dostępny, alias typu treści zostaje utajniony w katalogu typów treści i wszystkie odwołania do niego są interpretowane jako odwołania do docelowego typu treści. Jeśli preferowany typ treści nie jest dostępny, alias będzie używany podobnie jak zwykły typ treści.