Projektgattungen

org.eclipse.core.resources.natures

Der Arbeitsbereich unterstützt das Konzept der Projektgattungen (kurz "Gattungen" genannt. Über eine Gattung wird einem Projekt ein bestimmtes Verhalten für seine Gültigkeitsdauer zugeordnet. Gattungen werden projektbezogen unter Verwendung der Methode "setDescription" installiert, die für org.eclipes.core.resources.IProject definiert ist. Sie werden automatisch konfiguriert, sobald ein Projekt geöffnet wird, und dekonfiguriert, sobald ein Projekt geschlossen wird. Wird beispielsweise die Gattung "Java" zu einem Projekt hinzugefügt, kann ein Java-Erstellungsprogramm installiert und eine weitere Projektkonfiguration vorgenommen werden.

Am Erweiterungspunkt für Gattungen können Gattungs-Writer ihre Gattungsimplementierung unter einem symbolischen Namen registrieren, der dann im Arbeitsbereich verwendet wird, um Gattungen aufzufinden und zu konfigurieren. Der symbolische Name ist die ID der Gattungserweiterung. Beim Definieren einer Gattungserweiterung sollten Benutzer einen aussagekräftigen Wert für das Attribut 'Name' einbeziehen, der ihr Erstellungsprogramm identifiziert und möglicherweise anderen Benutzern angezeigt werden kann.

Gattungen können Integritätsbedingungsbeziehungen zu anderen Gattungen angeben. Die Integritätsbedingung "one-of-nature" gibt an, dass in einem Projekt jeweils höchstens eine Gattung aus einer bestimmten Gruppe vorhanden sein kann. Dies setzt den gegenseitigen Ausschluss von Gattungen durch, die nicht miteinander kompatibel sind. Die Integritätsbedingung "requires-nature" gibt die Abhängigkeit von einer anderen Gattung an. Wird eine solche Gattung zu einem Projekt hinzugefügt, müssen alle erforderlichen Gattungen ebenfalls hinzugefügt werden. Die Gattungen werden garantiert so konfiguriert und dekonfiguriert, dass die von ihnen benötigten Gattungen vor ihnen konfiguriert und nach ihnen dekonfiguriert werden. Aus diesem Grund sind zyklische Abhängigkeiten zwischen Gattungen nicht zulässig.

Gattungen können nicht zu einem Projekt hinzugefügt bzw. aus ihm entfernt werden, wenn diese Änderung Integritätsbedingungen verletzen würde, die zuvor erfüllt wurden. Falls eine Gattung für ein Projekt konfiguriert wird, später allerdings feststellt, dass ihre Integritätsbedingungen nicht erfüllt werden, werden diese Gattung und alle Gattungen, die sie voraussetzen, als inaktiviert gekennzeichnet, verbleiben aber im Projekt. Dies kann beispielsweise eintreten, wenn eine erforderliche Gattung bei der Installation fehlt. Gattungen, die bei der Installation fehlen werden ebenso als inaktiviert gekennzeichnet wie Gattungen, die an Abhängigkeitszyklen beteiligt sind.

Gattungen können außerdem angeben, welche schrittweisen Projekterstellungsprogramme ggfs. durch sie konfiguriert werden. Mit diesen Informationen stellt der Arbeitsbereich sicher, dass Erstellungsprogramme nur dann ausgeführt werden, wenn die zugehörige Gattung vorhanden und im Projekt, das erstellt werden soll, aktiviert ist. Falls eine Gattung aus einem Projekt entfernt wurde, die Dekonfigurationsmethode der Gattung jedoch die entsprechenden Erstellungsprogramme nicht entfernen kann, entfernt der Arbeitsbereich diese Erstellungsprogramme automatisch aus der Spezifikation. Zwei Gattungen dürfen in ihren Konfigurationsbefehlen nicht dasselbe schrittweise Projekterstellungsprogramm angeben.

Gattungen können die Erstellung von verlinkten Ressourcen in Projekten, denen sie zugeordnet sind, verhindern. Wenn Sie das Attribut allowLinking auf "false" setzen, kann eine Gattung deklarieren, dass verlinkte Ressourcen in keinem Fall erstellt werden. Diese Funktionsweise ist erstmals in Release 2.1 verfügbar.

Beginnend mit Release 3.1 können Gattungen Affinität mit beliebigen Inhaltstypen deklarieren und dadurch die Weise der Inhaltstypbestimmung für Dateien in dem Arbeitsbereich beeinflussen. Im falle von Konflikten (wenn zwei oder mehr Inhaltstypen gleichermaßen für eine gegebene Datei geeignet erscheinen), wird der Inhaltstyp gewählt, der eine Affinität zu einer der Gattungen hat, die für das entsprechende Projekt konfiguriert worden sind.

<!ELEMENT extension (runtime , (one-of-nature | requires-nature | builder | content-type)* , options?)>

<!ATTLIST extension

point CDATA #REQUIRED

id    CDATA #REQUIRED

name  CDATA #IMPLIED>


<!ELEMENT runtime (run)>



<!ELEMENT run (parameter*)>

<!ATTLIST run

class CDATA #REQUIRED>


<!ELEMENT parameter EMPTY>

<!ATTLIST parameter

name  CDATA #REQUIRED

value CDATA #REQUIRED>


<!ELEMENT one-of-nature EMPTY>

<!ATTLIST one-of-nature

id CDATA #REQUIRED>


<!ELEMENT requires-nature EMPTY>

<!ATTLIST requires-nature

id CDATA #REQUIRED>


<!ELEMENT builder EMPTY>

<!ATTLIST builder

id CDATA #REQUIRED>


<!ELEMENT options EMPTY>

<!ATTLIST options

allowLinking (true | false) >


<!ELEMENT content-type EMPTY>

<!ATTLIST content-type

id CDATA #REQUIRED>


Das folgende Beispiel zeigt drei Gattungskonfigurationen. Die Gattungen "waterNature" und "fireNature" gehören zur gleichen exklusiven Gruppe, weshalb sie nicht in demselben Projekt koexistieren können. Die Gattung "snowNature" erfordert die Gattung "waterNature". Daher wird "snowNature" in einem Projekt inaktiviert, in dem "waterNature" fehlt. Daraus folgt logischerweise, dass "snowNature" in einem Projekt mit "fireNature" nicht aktiviert werden kann. Die Gattung "fireNature" lässt außerdem die Erstellung von verlinkten Ressourcen nicht zu.

 
   

<extension id=

"fireNature"

name=

"Fire Nature"

point=

"org.eclipse.core.resources.natures"

>

<runtime>

<run class=

"com.xyz.natures.Fire"

/>

</runtime>

<one-of-nature id=

"com.xyz.stateSet"

/>

<options allowLinking=

"false"

/>

</extension>

<extension id=

"waterNature"

name=

"Water Nature"

point=

"org.eclipse.core.resources.natures"

>

<runtime>

<run class=

"com.xyz.natures.Water"

/>

</runtime>

<one-of-nature id=

"com.xyz.stateSet"

/>

</extension>

<extension id=

"snowNature"

name=

"Snow Nature"

point=

"org.eclipse.core.resources.natures"

>

<runtime>

<run class=

"com.xyz.natures.Snow"

>

<parameter name=

"installBuilder"

value=

"true"

/>

</run>

</runtime>

<requires-nature id=

"com.xyz.coolplugin.waterNature"

/>

<builder id=

"com.xyz.snowMaker"

/>

</extension>

Wenn diese Erweiterungen in einem Plug-in mit der Kennung "com.xyz.coolplugin" definiert wurden, wären die vollständig qualifizierten Namen dieser Gattungen "com.xyz.coolplugin.fireNature", "com.xyz.coolplugin.waterNature" und "com.xyz.coolplugin.snowNature".

Der Wert des Attributs "class" muss ein Implementierungselement von org.eclipse.core.resources.IProjectNature darstellen. Gattungsdefinitionen können unter Verwendung der Schnittstelle org.eclipse.core.resources.IProjectNatureDescriptor untersucht werden. Die Deskriptorobjekte können mit Hilfe der Methoden getNatureDescriptor(String) und getNatureDescriptors() aus org.eclipse.core.resources.IWorkspace abgerufen werden.

Die Plattform selbst verfügt nicht über vordefinierte Gattungen. Spezielle Produktinstallationen können ggfs. Gattungen enthalten.