Классификаторы проектов

org.eclipse.core.resources.natures

Рабочая область поддерживает понятие классификаторов проектов (или просто классификаторов). Классификатор связывает параметры рабочего цикла с проектом. Классификаторы устанавливаются для каждого проекта отдельно с помощью метода setDescription, определенного в org.eclipes.core.resources.IProject. Они автоматически настраиваются при открытии проекта и уничтожаются при его закрытии. Например, классификатор Java, будучи добавленным в проект, может устанавливать компоновщик Java и выполнять другие операции по настройке проекта.

Точка расширения классификаторов позволяет создателям классификаторов регистрировать реализацию классификатора под символьным именем, которое затем используется в рабочей области для поиска и настройки классификаторов. Символьное имя - это идентификатор расширения классификатора. При определении расширения классификатора пользователям рекомендуется добавлять в атрибут "name" удобочитаемое значение, которое будет обозначать классификатор и может быть представлено другим пользователям.

Классификаторы могут задавать ограничения, связанные с другими классификаторами. Ограничение "единственный классификатор" означает, что в каждый момент в проекте может существовать не более одного классификатора из заданного набора. Это предотвращает появление несовместимых классификаторов. Ограничение "обязательный классификатор" задает зависимость от другого классификатора. При добавлении классификатора в проект вместе с ним должны быть добавлены и все обязательные классификаторы. Классификаторы гарантированно настраиваются и уничтожаются таким образом, что их обязательные классификаторы всегда настраиваются до них и уничтожаются после них. По этой причине, циклические зависимости между классификаторами запрещены.

Классификаторы нельзя добавлять в проект или удалять из проекта, если такое изменение вызовет нарушение соблюдавшихся ранее ограничений. Если классификатор настроен в проекте, но впоследствии он обнаружит, что его ограничения не соблюдаются, то этот классификатор и все классификаторы, для которых он является обязательным, помечаются как отключенные, хотя и остаются в проекте. Это может произойти, например, в случае, когда обязательный классификатор отсутствует с момента установки. Классификаторы, отсутствующие с момента установки, и классификаторы, участвующие в циклических зависимостях, также помечаются как отключенные.

Классификаторы могут также указывать, какие дополняющие компоновщики проекта, если они есть, были ими настроены. Благодаря этой информации рабочая область сможет запускать такие компоновщики только при условии, что соответствующие классификаторы существуют и включены в компонуемом проекте. Если классификатор удален из проекта, но уничтожающему методу классификатора не удается удалить его соответствующие компоновщики, то рабочая область автоматически удалит эти компоновщики из спецификации. Не допускается, чтобы два классификатора указывали один и тот же дополняющий компоновщик проектов в своем описании.

Классификаторы также могут запрещать создание связанных ресурсов в тех проектах, с которыми классификаторы связаны. Присвоив атрибуту allowLinking значение "false", классификатор может объявить, что создание связанных ресурсов запрещено. Эта возможность впервые появилась в выпуске 2.1.

Начиная с выпуска 3.1, классификаторы могут объявлять связанность с произвольными типами содержимого, таким образом влияя на то, как происходит определение типа содержимого для файлов в рабочей области. В случае конфликта (два или больше типов одинаково подходят для файла), выбирается тип содержимого, имеющий связанность с любым из классификаторов, настроенных для соответствующего проекта.

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


Ниже приведено три примера конфигурации классификатора. Классификаторы waterNature и fireNature принадлежат одному исключительному набору, поэтому они не могут существовать одновременно в одном и том же проекте. Классификатору snowNature необходим классификатор waterNature, поэтому snowNature будет отключен в проекте, в котором отсутствует waterNature. Как следствие, snowNature не может быть включен в проекте, содержащем fireNature. Кроме того, классификатор fireNature запрещает создание связанных ресурсов.

 
   

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

Если эти расширения были определены в модуле с идентификатором "com.xyz.coolplugin", то полными именами этих классификаторов будут "com.xyz.coolplugin.fireNature", "com.xyz.coolplugin.waterNature" и "com.xyz.coolplugin.snowNature".

Значение атрибута class должно представлять исполнитель класса org.eclipse.core.resources.IProjectNature. Определения классификаторов можно проверить с помощью интерфейса org.eclipse.core.resources.IProjectNatureDescriptor. Объекты дескриптора можно получать с помощью методов getNatureDescriptor(String) и getNatureDescriptors() в org.eclipse.core.resources.IWorkspace.

Платформа не содержит предопределенных классификаторов. В конкретных устанавливаемых версиях продукта могут содержаться необходимые классификаторы.