Практическая работа с XML: Создание проекта

Добавление в Eclipse новых мастеров

Продолжается работа по интеграции Eclipse – проекта IBM разработки ПО с открытым исходным кодом по созданию расширяемой интегрированной среды разработки (ИСР) для Java-программистов – с простым решением для управления контентом Бенуа Маршаля, XM. В этом выпуске Бенуа добавляет мастер инициализации нового проекта. В процессе он делится некоторыми с трудом добытыми знаниями о платформе Eclipse.

Бенуа Маршаль, консультант, Pineapplesoft

фото автораБенуа Маршаль (Benoît Marchal) – бельгийский консультант. Он автор многих книг, посвященных XML, в том числе «XML на примерах, второе издание» XML by Example, Second EditionБёнуа Маршаль специализируется в области XML, технологий Java и электронной коммерции. Более подробную информацию о нем можно получить на его сайте www.marchal.com. С ним можно связаться по адресу bmarchal@pineapplesoft.com.



01.10.2010 (Впервые опубликовано 16.11.2011)

1 октября 2010 г. – Исправлены две неработающие ссылки в разделе Ресурсы.

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

Переносимость SWT

Важным преимуществом Eclipse является устранение одного из главных недостатков технологии Java: библиотеки пользовательского интерфейса. Как я уже писал, Eclipse использует Standard Widget Toolkit (SWT), который сочетает в себе лучшие черты Abstract Windowing Toolkit (AWT) с использованием стандартных элементов управления и богатым набором виджетов Swing. Наконец, появилась возможность разрабатывать сложные пользовательские интерфейсы, которые ведут себя как их стандартные собратья.

Большинство критических отзывов по поводу SWT относятся к проблеме переносимости. Так как SWT не входит в состав JDK (Java Development Kit), он доступен не на всех платформах. К счастью, команда Eclipse, кажется, намерена перенести SWT на все необходимые платформы, так что на практике проблем быть не должно.

Мне было интересно проверить переносимость SWT, поэтому, как только он появился, я скачал версию для Macintosh. Mac-версия достаточно стабильна, несмотря на то, что она все еще находится в стадии разработки. Однако больше всего меня впечатлил SWT и его способность рисовать стандартные элементы управления Aqua.


О документации

Пробовать новые проекты и писать о них очень интересно, но есть и обратная сторона: документация по новым проектам часто бывает неполной. Eclipse – не исключение. Для написания этой статьи – или, скорее, кода для нее – потребовалось много исследований. Документация ограничивается несколькими статями о принципах построения, описанием API и, к счастью, исходным кодом.

Разработка выполнялась главным образом методом проб и ошибок – работа над кодом шла до тех пор, пока не получится что-то дельное. К сожалению, часто я думал, что что-то понял, и переходил к новой задаче только для того, чтобы обнаружить, что был неправ! В конце концов, я достиг точки, когда был уверен, что пониманию все. Ни одна из проблем, с которыми я столкнулся, не имела решающее значение, но в совокупности все эти проблемы значительно усложнили работу. По мере написания дальнейших статей проблема (отсутствия) документации должна быть окончательно решена.


Эволюция плагина XM

Форум "Практической работы с XML"

Новое программное обеспечение форума упростило его использование, так что присоединяйтесь к дискуссии – по XML, другим проектам или по Eclipse, – нажав кнопку Обсудить вверху или внизу этой статьи.

В конце предыдущей статьи Интеграция XM с Eclipse я добился грубой интеграции XM с Eclipse. Я добавил в контекстное меню пункт, который пользователь может выбрать для запуска XM. Я знал, что это только первый шаг, но когда я (и другие сотрудники Pineapplesoft) начал использовать его, то понял, что предстоит еще многое сделать. В частности, я заметил следующие недостатки:

  • запускать проект трудно. сначала нужно запустить мастер New Project, а затем вручную создать несколько файлов. Мастер сам должен обо всем позаботиться;
  • файл .xmp вводит в заблуждение. В большинстве случаев он остается пустым, так как используется только в качестве цели при нажатии кнопки. Первоначально XM не нуждался в файлах конфигурации, что было одним из его преимуществ;
  • нажатие правой кнопки мыши характерно для Windows/KDE/Gnome. На Mac правую кнопку лучше оставить для сложных, редких операций. Нужен более универсальный интерфейс. В Eclipse можно регистрировать построители (по существу, компиляторы). При изменении проекта Eclipse автоматически вызывает соответствующие построители.

Учитывая эти недостатки, я решил, что в ближайшем будущем в плагин XM нужно включать мастер New Project и возможность обращаться к XM при создании проекта. Обе эти две функции реализованы через точки расширения. (Подробнее о точках расширения см. в статье "Применение Eclipse для построения пользовательского интерфейса XM" в разделе Ресурсы.) Точкой расширения для нового мастера служит org.eclipse.ui.newWizards с использованием интерфейса org.eclipse.ui.INewPlugin. Точкой расширения для построителя служит org.eclipse.core.resources.builders с использованием интерфейса org.eclipse.core.resources.IncrementalProjectBuilder.


Мастер нового проекта

Мастер нового проекта и построитель взаимосвязаны. Например, при создании нового проекта Eclipse автоматически вызывает построитель. Загрузив код из онлайнового хранилища, вы увидите, что в нем реализовано и то, и другое. В этой статье рассматривается мастер, а в следующей будет рассмотрен построитель.

Файлы и каталоги проекта

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

Перечень проектов, имеющихся в распоряжении пользователя, это рабочее пространство. По умолчанию проекты хранятся в каталоге eclipse/workspace, но пользователь может создавать их в любом месте.

Пользователь взаимодействует с проектами посредством панели навигатора, как показано на рисунке 1. Опять же, с помощью плагинов можно добавлять специализированные навигаторы. На рисунке 1 изображен простой навигатор со списком ресурсов (файлов) в проектах.

Рисунок 1. Навигатор Eclipse
Навигатор Eclipse

Для создания нового проекта нужен новый каталог и несколько файлов конфигурации, которые управляют средой Eclipse. Отметим, что недостаточно создать новый каталог в рабочем пространстве – Eclipse не признает его как проект.

Сущность проекта

Основной файл конфигурации проекта называется .project (точка в файловых системах UNIX означает скрытый файл). Он содержит информацию о том, как построить проект, а также сущность проекта.

Сущность (nature) – это указатель типа проекта. Например, проект Java имеет сущность Java. Eclipse использует сущность проекта для управления взаимодействием с пользователем. Сущность может включать или отключать пункты меню, так что проект с сущностью Java содержит пункты меню, ориентированные на Java.

Проект может иметь более одной сущности. Например, проект плагина – это проект Java (ведь плагины написаны на языке Java) и одновременно проект плагина. На практике присутствуют пункты меню для того и другого.

Как и другие идентификаторы Eclipse, идентификаторы сущности начинаются с имени домена в обратном порядке, подобно именам пакетов. Например, идентификатор сущности Java выглядит так: org.eclipse.jdt.core.javanature. Не путайте это с идентификатором имени класса/пакета. (Подробнее об идентификаторах см. в статье "Использование Eclipse для построения пользовательского интерфейса XM" в разделе Ресурсы.)

Узнав это, я понял, что сущность проекта делает фиктивный файл .xmp (он был описан в предыдущем выпуске) ненужным. Если определить специальную сущность для проектов XM, то с этими проектами можно связать элемент меню Run XM, описанный в статье Интеграция XM и Eclipse.

Я определил сущность проекта XM как org.ananas.xm.eclipse.xmnature. Листинг 1 иллюстрирует, как в связи с этим изменился манифест (plugin.xml).

Листинг 1. Новая точка расширения
<extension point="org.eclipse.ui.popupMenus">
   <objectContribution adaptable="true"
         objectClass="org.eclipse.core.resources.IResource"
         id="org.ananas.xm.eclipse.popupMenu">
      <filter name="projectNature"
            value="org.ananas.xm.eclipse.xmnature">
      </filter>
      <action label="Run XM"
              tooltip="Call XM to publish the site."
              class="org.ananas.xm.eclipse.XMRunner"
              menubarPath="additions"
              enablesFor="+"
              id="org.ananas.xm.eclipse.popMenu.action">
      </action>
   </objectContribution>
</extension>

Если сравнить листинг 1 с кодом, опубликованным ранее, то можно заметить следующие изменения:

  • атрибут nameFilter заменен тегом filter. Filter совпадает с сущностью проекта, nameFilter совпадает с именами файлов;
  • атрибут enablesFor заменен на +, что означает, что в проекте можно выбрать несколько файлов. Это просто для удобства пользователя;
  • класс XMRunner в основном остался без изменений. Однако я сократил имя пакета, чтобы меньше печатать.

Мастер нового проекта XM

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

Мастера Eclipse

Eclipse – невероятно расширяемая среда, и это отражается на том, как в ней устроены мастера. В Eclipse мастер может быть составлен из нескольких плагинов. Мастер проекта использует эту возможность.

Когда пользователь выбирает Новый проект из меню, отображается мастер, показанный на рисунке 2. Пользователь выбирает тип создаваемого проекта. Хотя XM появляется в списке, плагин XM еще не загружен. Список заполняется из манифеста (plugin.xml).

Рисунок 2. Мастер нового проекта
Мастер нового проекта

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

Рисунок 3. Плагин загружен
Плагин загружен

Для достижения столь прозрачной интеграции Eclipse разбивает мастер на три группы объектов:

  • контейнер ― диалоговое окно с кнопками;
  • мастера – реагируют на действия пользователя; для этого контейнер взаимодействует с одним или несколькими мастерами;
  • страницы – отображают элементы управления внутри контейнера. Каждый раз, когда пользователь нажимает кнопку "Далее", загружается новая страница. На рисунке 3 страница управляет полями названия и каталога проекта.

Реализация XM

XM реализует мастер в классе NewXMProjectWizard. Этот класс реализует интерфейс INewWizard. На практике простейшее решение – производное от Wizard, так как этот класс представляет собой реализацию по умолчанию для большинства методов, определенных в INewWizard.

NewXMProjectWizard, как всегда, зарегистрирован в качестве точки расширения в манифесте. В листинге 2 приведена соответствующая выдержка из манифеста. Обратите внимание, что он объявляет категорию мастера. В этой категории могут быть сгруппированы несколько мастеров XM.

Листинг 2. Точка расширения Wizard
<extension point="org.eclipse.ui.newWizards">
   <category name="ananas.org"
             id="org.ananas.xm.eclipse.newWizards">
   </category>
   <wizard name="XM Project"
           icon="icons/newproject16.gif"
           category="org.ananas.xm.eclipse.newWizards"
           class="org.ananas.xm.eclipse.NewXMProjectWizard"
           project="true"
           id="org.ananas.xm.eclipse.newproject">
      <description>Create an XM project.</description>
   </wizard>
</extension>

Тег wizard – новый для мастеров, но он очень напоминает тег view, введенный в предыдущей статье, так что он должен быть знаком читателю. Единственное новшество – атрибут project: значение true этого атрибута указывает на то, что он добавляет мастер в новый список проектов. Без этого атрибута мастера перечисляются в категории "прочие".

После загрузки плагина контейнер вызывает метод init(). NewXMProjectWizard нуждается в некоторой инициализации. Сначала он вызывает метод setNeedsProgressMonitor(), чтобы затребовать индикатор хода выполнения операции. При создании проекта он удлиняет полоску индикатора, как показано в листинге 3.

Листинг 3. Метод init()
public void init(IWorkbench workbench,
                 IStructuredSelection selection)
{
   setNeedsProgressMonitor(true);
}

Затем контейнер вызывает метод addPages(), как показано в листинге 4. Этот метод регистрирует страницы мастера. NewXMProjectWizard нужна только одна страница, которая запрашивает имя и местоположение проекта. Eclipse удобно предоставляет такую страницу в классе WizardNewProjectCreationPage (она показана на рисунке 2).

Листинг 4. Метод addPages()
public void addPages()
{
 super.addPages();
 namePage = new WizardNewProjectCreationPage("NewXMProjectWizard");
 namePage.setTitle(Resources.getString("eclipse.newprojectname"));
 namePage.setDescription(Resources.getString("eclipse.newprojectdescription"));
 namePage.setImageDescriptor(ImageDescriptor.createFromFile(getClass(),
       "/org/ananas/xm/eclipse/resources/newproject58.gif"));
 addPage(namePage);
}

Мастер вызывает метод addPage() для каждой страницы, которую регистрирует. В данном случае это всего одна страница.

Пользователь нажимает кнопку Finish

Когда пользователь нажимает Finish, выполняется метод performFinish(). В листинге 5 приведено содержание этого метода. В этом методе мало что происходит. Основная часть работы по созданию проекта выполняется в методе createProject(), который косвенно вызывается методом performFinish().

Листинг 5. Метод performFinish()
public boolean performFinish()
{
   try
   {
      WorkspaceModifyOperation op =
         new WorkspaceModifyOperation()
      {
         protected void execute(IProgressMonitor monitor)
         {
            createProject(monitor != null ?
                          monitor : new NullProgressMonitor());
         }
      });
      getContainer().run(false,true,op);
   }
   catch(InvocationTargetException x)
   {
      reportError(x);
      return false;
   }
   catch(InterruptedException x)
   {
      reportError(x);
      return false;
   }
   return true; 
}

В результате создания проекта изменяется рабочее пространство, так как он добавляет каталоги и файлы. В процессе модификации мастер синхронизируется с рабочим пространством. Самым простым решением будет создание проекта в потомке класса WorkspaceModifyOperation.

Код, изменяющий рабочее пространство, должен вызываться из метода execute(). В листинге 5 он просто вызывает метод createProject(). execute() берет в качестве аргумента IProgressMonitor. Если для создания проекта требуется время, мастер отчитывается о ходе своей работы через этот аргумент. Контейнер использует его для обновления индикатора хода выполнения операции.

Наиболее полезные методы класса IProgressMonitor:

  • beginTask(), который вызывается перед началом операции. Он принимает описание и продолжительность операции;
  • worked() отчитывается о ходе выполнения операции. Обычно он обновляет индикатор хода выполнения операции.
  • done() вызывается, когда проект создан;
  • subTask() позволяет изменять описание.

Продолжительность процесса создания проекта и его ход отображаются в единицах работы. Вы сами определяете эти единицы. Например, при обработке файлов каждая единица может быть файлом.

Для выполнения потока вызовем метод run() в контейнере. Контейнер синхронизирует свой индикатор хода выполнения с IProgressMonitor.

Создание проекта

Фактическое создание проекта происходит в методе createProject() (см. листинг 6). Для этого метода очень важен порядок следования операторов: если код следует не в надлежащем порядке, мастер выдаст ошибку (часто с запутанными сообщениями).

Чтобы создать новый проект, выполните следующие действия.

  1. Извлеките корень рабочего пространства в виде экземпляра IWorkspaceRoot. В Eclipse есть удобный плагин (ResourcesPlugin), через который можно получить доступ к ресурсам, в том числе к рабочему пространству. Опять же, ресурсы Eclipse – это файлы и каталоги.
  2. Вызовите getProject() из IWorkspaceRoot. (Лично я считаю, что этот метод правильнее было бы называть newProject(), так как он создает проект.)
  3. Создайте пустое описание проекта с помощью метода newProjectDescription(). Описание проекта содержит определенную информацию о проекте, в том числе о его местонахождении в файловой системе.
  4. Если пользователь выбирает расположение по умолчанию (в каталоге workspace), переходите к следующему шагу. В противном случае укажите местоположение в объекте описания. По некоторым причинам создание проекта не сработает, если явно указать в качестве местоположения проекта местоположение по умолчанию.
  5. Зарегистрируйте сущности проекта, если они есть. Это массив строковых идентификаторов.
  6. Зарегистрируйте построители проекта (или компиляторы). Сейчас XM доступен в качестве построителя – я расскажу о нем в следующей статье.
  7. Создание проекта с помощью метода create().
  8. Наконец, откройте вновь созданный проект.

После создания и открытия проекта можете определить его свойства. Они хранятся вместе со свойствами Eclipse. Как видно из листинга 6, мастер задает несколько свойств построителя XM. Вы должны быть знакомы с ними, так как они совпадают с файлом .xmp, описанным в статье Интеграция XM и Eclipse.

Наконец, мастер помещает в проект каталоги по умолчанию (обычно src, rules и publish), пример XML-документа и простую таблицу стилей. Это просто для удобства пользователя.


В конвейере

Если вы загрузили исходный код из онлайн-репозитория (см. раздел Ресурсы), то плагин предложит еще и построитель. Сам этот построитель ― тема моей следующей статьи.

Эта статья демонстрирует, что Eclipse предоставляет вам, разработчику плагина, огромную свободу по управлению опытом пользователя. В результате ваш плагин может расширить практически любой аспект пользовательского интерфейса.

Ресурсы

Научиться

Получить продукты и технологии

  • Загрузите плагин из онлайн-хранилища.
  • Eclipse – проект по разработке ИСР с открытым исходным кодом. Инициирован IBM.
  • Портал WebSphere, отличное решение, когда надо создать сложный портал.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



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

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML
ArticleID=846152
ArticleTitle=Практическая работа с XML: Создание проекта
publish-date=10012010