Vkládání typů obsahu

Poskytnutí nového typu obsahu

Platforma definuje určité základní typy obsahu, například prostý text a XML. Tyto typy obsahu jsou definovány stejným způsobem jako typy obsahu vložené jinými moduly plug-in. Abychom lépe porozuměli infrastruktuře typu obsahu, podíváme se nyní na způsob, kterým platforma definuje některé ze svých typů obsahu.

Moduly plug-in definují typy obsahu vložením rozšíření pro bod rozšíření org.eclipse.core.runtime.contentTypes. V tomto rozšíření modul plug-in určuje jednoduché ID a název typu obsahu (úplné ID je vždy jednoduché ID doplněné vlevo o aktuální obor názvů). Následující úsek kódu předvádí sníženou verzi příspěvku typu obsahu 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>
		...

Atribut file-extensions určuje přípony souboru, které jsou přidruženy typu obsahu (v tomto příkladu ".txt"). Atribut file-names (v tomto případě není použit) umožňuje přidružování úplných názvů. Oba parametry platforma zohledňuje při provádění detekce a popisu typu obsahu (pokud klient zadá název souboru).

Prvek describer se používá k definici popisovače obsahu pro typ obsahu.

Detekce a popisování obsahu

Typ obsahu by měl poskytovat popisovač obsahu, existují-li nějaké identifikovatelné charakteristiky, které umožňují automatickou detekci typu obsahu, nebo nějaké zajímavé vlastnosti dat patřících k typu obsahu. V případě org.eclipse.core.runtime.text nelze stanovit typ obsahu prostým prohlédnutím obsahu. Textové toky mohou být doplněny značkou pořadí bajtu, což je vlastnost, která může být pro klienty zajímavá a takto zajišťuje popisovač obsahu.

Popisovač je implementací IContentDescriber nebo ITextContentDescriber. Druhý prvek je speciální verzí prvku prvního a musí být implementován popisovači textově orientovaných typů obsahu. Bez ohledu na charakter typu obsahu má popisovač dva úkoly: pomáhá určit, zda je jeho typ obsahu vhodný pro daný datový tok, a získává z datového toku zajímavé vlastnosti, o kterých lze předpokládat, že patří k jeho typu obsahu.

Metoda describe(tok, popis) je volána vždy, když se platforma pokouší stanovit typ obsahu určitého datového toku nebo popsat jeho obsah. Popis je null, pokud je požadována pouze detekce. V opačném případě se popisovač pokusí sestavit popis obsahu výlučně s použitím vlastností, které lze nalézt čtením toku. K deklaraci vlastností, které mají výchozí hodnoty (například org.eclipse.core.runtime.xml deklaruje jako výchozí znakovou sadu UTF-8), by měl být použit markup typu obsahu.

Očekává se, že popisovač obsahu provede tento úkol co nejrychleji. Čím měně je zapotřebí číst datový tok, tím lépe. Rovněž se očekává, že implementace popisovače obsahu bude deklarována v balíčku, který je vyňatý z aktivace modulu plug-in (viz záhlaví manifestu balíku Eclipse-AutoStart). Protože instance veškerých popisovačů se vytvářejí při inicializaci infrastruktury typu obsahu, nedodržení tohoto požadavku způsobí předčasnou aktivaci, které musíte zamezit. Budoucí implementace platformy vytvoření instancí popisovačů odmítnou, pokud by realizace této operace vyvolala aktivaci příslušného modulu plug-in.

Rozšíření stávajícího typu obsahu

Typy obsahu mají hierarchickou povahu. To umožňuje, aby nové typy obsahu využívaly výhody atributů nebo chování obecnějších typů obsahu. Například typ obsahu dat XML je považován za podřízený prvek typu textový obsah:

       <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>

Soubor XML je považován za určitý typ textového souboru, takže veškeré funkce použitelné pro textový soubor lze použít i pro soubor XML.

Povšimněte si, že typ obsahu XML potlačuje několik atributů typu obsahu definované původně pro textový typ obsahu, např. přiřazení souboru a implementaci popisovače. Tento typ obsahu rovněž deklaruje výchozí hodnotu vlastnosti charset. To znamená, že pokud během popisování obsahu datového toku, jehož obsah je považován za obsah typu XML, popisovač nesplní vlastnost znakové sady, nastaví platforma znakovou sadu "UTF-8".

V dalším příkladu typ obsahu org.eclipse.ant.core.antBuildFile (pro skripty sestavení Ant) rozšiřuje typ obsahu 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>

Povšimněte si, že výchozí hodnota vlastnosti znakové sady je zděděná. Zděděnou vlastnost nebo popisovač lze zrušit nastavením hodnoty prázdného řetězce.

Přídavná přiřazení souborů

Ke stávajícím typům obsahu lze přidávat nová přiřazení souborů. Například modul plug-in prostředků (Resources) přiřazuje soubory org.eclipse.core.runtime.xml na ".project":

	<extension point="org.eclipse.core.runtime.contentTypes">
	<file-association content-type="org.eclipse.core.runtime.xml" file-names=".project"/>
	...

Alias typu obsahu

Kvůli rozšiřitelnému charakteru platformy Eclipse nemusí být v dané konfiguraci produktu k dispozici typ obsahu, na němž modul plug-in závisí. Tento problém lze řešit použitím aliasu typu obsahu. Alias typu obsahu je symbolický argument pro jiný preferovaný typ obsahu, jehož dostupnost není zaručena. Například běhový modul deklaruje alias (org.eclipse.core.runtime.properties) pro typ obsahu vlastností Java poskytovaný vývojovými nástroji Java (org.eclipse.jdt.core.javaProperties):

<!-- symbolický argument pro konfigurace, ve kterých není k dispozici oficiální typ JDT -->			
<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-2"/>
</content-type>

Toto poskytuje modulům plug-in symbolický argument, na který lze odkazovat bez ohledu na momentální dostupnost preferovaného typu obsahu. Pokud k dispozici je, dojde k potlačení aliasu typu obsahu v katalogu typů obsahu a veškeré odkazy se interpretují jako odkazy na cílový typ obsahu. Pokud není k dispozici, použije se alias jako řádný typ obsahu.