Модули используют классификаторы проекта для распознавания вида проекта. Например, в JDT используется "классификатор Java", который позволяет добавлять в проект функции Java. Классификаторы проекта определяются модулями и обычно добавляются в проект или удаляются из него, когда пользователь выполняет действия, определенные модулем.
Проект может иметь несколько классификаторов. Однако при определении классификатора проекта можно задать для него особые ограничения:
Для создания собственного классификатора необходимо определить расширение и задать класс, который реализует интерфейс IProjectNature.
Точка расширения org.eclipse.core.resources.natures используется для добавления определения классификатора проекта. Следующий фрагмент кода добавляет классификатор для гипотетического модуля com.example.natures.
<extension
point="org.eclipse.core.resources.natures"
id="mynature"
name="My Nature">
<runtime>
<run class="com.example.natures.MyNature">
</run>
</runtime>
</extension>
Класс, определенный в расширении, должен реализовывать интерфейс IProjectNature. Данный класс реализует функции модуля для связывания информации классификатора с проектом во время настройки данного классификатора.
public class MyNature implements IProjectNature {
private IProject project;
public void configure() throws CoreException {
// Добавление информации классификатора
// для проекта, например, добавление компоновщика
// в спецификацию компоновки данного проекта.
}
public void deconfigure() throws CoreException {
// Удаление информации классификатора.
}
public IProject getProject() {
return project;
}
public void setProject(IProject value) {
project = value;
}
}
При добавлении или удалении классификаторов из проекта платформа вызывает методы configure() и deconfigure(). Метод configure() позволяет добавить в проект компоновщик, как описано в разделе Компоновщики.
Для связывания классификатора с проектом одного его определения недостаточно. Необходимо обновить описание проекта и включить в него классификатор. Обычно это происходит при создании нового проекта с помощью специального мастера новых проектов, который присваивает классификатор. Следующий фрагмент кода демонстрирует, как присвоить проекту новый классификатор.
try {
IProjectDescription description = project.getDescription();
String[] natures = description.getNatureIds();
String[] newNatures = new String[natures.length + 1];
System.arraycopy(natures, 0, newNatures, 0, natures.length);
newNatures[natures.length] = "com.example.natures.mynature";
description.setNatureIds(newNatures);
project.setDescription(description, null);
} catch (CoreException e) {
// Исключительная ситуация
}
Примечание: В качестве имени классификатора в команде указывается полный ИД расширения классификатора. Полный ИД расширения создается путем объединения ИД модуля с ИД простого расширения из файла plugin.xml. Например, классификатор с ИД простого расширения "mynature", входящий в состав модуля "com.example.natures", будет называться "com.example.natures.mynature".
Фактически классификаторы не могут быть присвоены и настроены для проекта, пока не задано описание проекта. Также следует помнить, что идентификатор, который используется для классификатора, представляет собой полное имя расширения классификатора (идентификатор модуля + идентификатор расширения).
Если классификатор определен с ограничениями, для его проверки можно использовать API рабочей области. Например, классификатор имеет следующее предварительное требование:
<extension
point="org.eclipse.core.resources.natures"
id="myOtherNature"
name="My Other Nature">
<runtime>
<run class="com.example.natures.MyOtherNature">
</run>
</runtime>
<requires-nature id="com.example.natures.mynature"/>
</extension>
Новый классификатор будет действителен, если для данного проекта существует первый классификатор. В зависимости от структуры модуля, пользователю может потребоваться проверить, установлен ли необходимый классификатор, или добавить новый необходимый классификатор. В любом случае для проверки предложенных комбинаций классификаторов проекта можно использовать API рабочей области.
try {
IProjectDescription description = project.getDescription();
String[] natures = description.getNatureIds();
String[] newNatures = new String[natures.length + 1];
System.arraycopy(natures, 0, newNatures, 0, natures.length);
newNatures[natures.length] = "com.example.natures.myOtherNature";
IStatus status = workspace.validateNatureSet(natures);
// проверка состояния и принятие решения
if (status.getCode() == IStatus.OK) {
description.setNatureIds(newNatures);
project.setDescription(description, null);
} else {
// возникла ошибка
...
}
} catch (CoreException e) {
// Исключительная ситуация
}
Помимо идентификатора, для обращения к классификатору можно использовать также дескриптор (IProjectNatureDescriptor), который описывает классификатор, его ограничения и метку. Дескриптор можно запросить у определенного классификатора или получить из рабочей области. Следующий фрагмент кода демонстрирует получение дескриптора классификатора проекта:
IProjectNatureDescriptor descriptor = workspace.getNatureDescriptor("com.example.natures.myOtherNature");
Кроме того, можно получить массив дескрипторов для всех установленных классификаторов:
IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();