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

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