Модули используют классификаторы проекта для распознавания вида проекта. Например, в 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();