Для разработчиков BE4

Материал из DevelopmenOnTheEdge
Перейти к: навигация, поиск

Здесь будет информация по архитектуре BE4.

На высоком уровне BE4 состоит из нескольких частей:

  • com.beanexplorer.enterprise.metadata* - ядро;
  • com.beanexplorer.enterprise.metadata.ant - реализация Ant задач, объявленных в be4/src/be4lib.xml, эти классы не должны использоваться во время исполнения BEclipse;
  • com.beanexplorer.enterprise.be4core - класс Be4QueryExecutor, необходимый для запуска Query относительно простым образом без необходимости хранить Query в таблице (в BE3 запуск Query происходит по имени или идентификатору Query в таблице queries, а мы в BE4 работаем только с модельными объектами представленными в виде Java объектов, а не строк в SQL таблицах); используется для запуска Query в BEeclipse и BE5;
  • com.beanexplorer.enterprise.eclipse - UI BEclipse и необходимые для его модельные элементы и view model;
  • com.beanexplorer.enterprise.api - заготовка фасада для использования простейшего API в тестах: загрузка проекта из папки (projectApi = Facade.load(path)), получение корректного DatabaseConnector (projectApi.getDatabaseConnector()) и запуск Freemarker скриптов (projectApi.runFreemarkerScript(string));
  • com.beanexplorer.enterprise.diagrams - здесь и модельные элементы, и UI для диаграмм; новые виды диаграм легче всего добавлять по аналогии со старыми, смотря на уже готовые классы;
  • com.beanexplorer.enterprise.planning - здесь и Model, и ViewModel, и View для для TasksView.

Ядро

  • com.beanexplorer.enterprise.metadata* - ядро.
    • exception - все базовые исключения для BE4, мы используем checked exceptions.
    • model* - самое сердце BE4 - модельные объекты, которые представляют собой дерево проекта, начиная с класса Project.
    • sql - скачивание legacy метаданных (дерева проекта) из BE3 базы данных, синхронизация с базой данных.
    • serialization - сохранённый на жёстком диске BE4 проект представляется как набор YAML файлов; данном пакете реализованы сериализация и десериализация YAML.
    • freemarker - расширение Freemarker, в частности Be4BuiltIns и DatabaseFunctions, макросы находятся в be4/src/com/beanexplorer/enterprise/metadata/freemarker/macro/common.ftl.
      • FreemarkerSqlHandler - получает на вход FreemarkerScript и запускает его как SQL, переадресуя сгенерированный текст в SqlExecutor.
    • util - базовые полезности; должны находиться в этом пакете, даже если используются только в UI

UI

Поскольку BEclipse - это плагин для Eclipse, UI реализован классическим способом для Eclipse плагинов. А именно:

  • весь основной функционал описан в plugin.xml,
    • это могут быть меню, команды, view, редакторы, wizard, страницы настроек и прочее. Для просмотра всего фунционала открываем plugin.xml на странице "Extensions".

Команды

Для создания команды неоходимо зарегистрировать два расширения:

  • org.eclipse.ui.commands
  • org.eclipse.ui.handlers

Дело в том, что в Eclipse одна и та же команда может быть запущена разными обработчиками, так что команда разделена на две части - собственно command, представляет собой абстрактную команду с именем и описанием, и handler - обработчик, ссылается на класс, реализующий функционал этой команды и указывающий, может ли он в данный момент обработать действие. Например, в Eclipse есть стандартная команда "Debug". В разных контекстах её обрабатывает разный обработчик - Java код запускается одним способом, а C++ код другим. При этом кнопка на панели инструментов и биндинг постоянно F11 ссылаются на одно и то же действие.

Наши обработчики команд лежат в com.beanexplorer.enterprise.eclipse.handlers и имеют названия, представляющие собой глаголы.

Так что для создания новой команды

  • кликаем на org.eclipse.ui.commands в нашем редакторе plugin.xml на вкладке Extensions, New -> command, даём уникальный идентификатор, читаемое имя и категорию (categoryId) com.beanexplorer.be4.ui.commands,
  • кликаем на org.eclipse.ui.handlers , New -> handler, выбираем только что созданную команду и новый класс из com.beanexplorer.enterprise.eclipse.handlers.

Меню

Это расширение org.eclipse.ui.menus (New -> menuContribution). Общий вид ссылки на меню (locationURI):

  • [menu|popup|toolbar]:<menuOrPartName>[?after=additions]

Здесь "menu", "popup", "toolbar" - предопределённые строки. <menuOrPartName> - либо "известное" имя типа org.eclipse.ui.main.menu или org.eclipse.ui.main.toolbar, либо имя редактора или view типа com.beanexplorer.enterprise.eclipse.BeProjectView.

popup:com.beanexplorer.enterprise.eclipse.BeProjectView - это, в частности, контекстное меню нашего дерева проекта. Для добавления в него новой команды кликаем на надпись "popup:com.beanexplorer.enterprise.eclipse.BeProjectView" (слева в дереве), New -> command, выбираем команды, указываем текст и выбираем иконку. Готово!

Замечание

Для того, чтобы найти класс с реализацией пункта меню, можно найти соответствующий пункт меню в редакторе plugin.xml, в нём будет указана команда, копируем имя команды в строку поиска в редакторе и находим нужный handler.

Редакторы и view

Хранятся в

  • com.beanexplorer.enterprise.eclipse.editors и
  • com.beanexplorer.enterprise.eclipse.views соответственно.

Аналогично командам, создаются через редактор, кликаем на com.beanexplorer.enterprise.eclipse.editors, New -> editor, заполняем необходимые поля. Аналогично со view. Замечу, что клик на метку "class" позволяет создать нужный класс (в случае со view это org.eclipse.ui.part.ViewPart, например).

Готовые диалоговые окна

com.beanexplorer.enterprise.eclipse.dialogs.Dialogs - простые реализации диалоговых окошек, которых не хватает в org.eclipse.jface.dialogs.MessageDialog.

MVVM и упрощение написания UI

Многие команды представляют собой одностраничные wizard'ы. Вместо того, чтобы писать с нуля, берём класс com.beanexplorer.enterprise.eclipse.handlers.templates.WizardCommandTemplateWizard, копируем в handlers, переименовываем (Alt+Shift+R) и заполняем всё что нужно.

Хорошей практикой являет написание UI с использованием шаблона проектирования MVVM. Пример - CreateDaemonWizard.CreateDaemonWizardPage из CreateDaemon. Это хороший пример с использованием MVVM и моментальной валидацией ввода пользовательских данных, который полагается на класс Ui из com.beanexplorer.enterprise.eclipse.jface. Другие примеры можно найти поискав использования Ui.SimpleBinding<T>.addToWizardPage (Ctrl+Shift+G) или других методов Ui.SimpleBinding<T>.

Класс com.beanexplorer.enterprise.eclipse.jface.Ui вообще содержит гибкую основу для реализации MVVM UI (примеры можно найти поискав использования класса Ui или его методов).

Класс com.beanexplorer.enterprise.eclipse.jface.JFace предоставляет методы для частовстречающихся сценариев (как правило создания виджетов внутри Composite с GridLayout из двух столбцов).

События

Автосериализация

Начинать смотреть с BeanExplorerProjectProvider.setProject - здесь регистрируются события разные события "codeChanged(SomeClass)" - в конечном счёте они вызывают Serialization.save(SomeClass).

Автодесериализация

Начинасть смотреть с BeanExplorerProjectProvider.setProject - здесь регистрируется "onModify" (статическая функция ON_MODIFY). ON_MODIFY.apply(Path) определяет по пути тип файла и десериализует его. При открытии проекта путь файла регистрируется через project.getAutomaticDeserializationService().registerFile(Path, Type). WatchDir же слушает изменения в файловой системе и отправляет их в onModify.

Другие события

См. различные BeanExplorerProjectProvider.registerLocal(ConcreteListener, Composite). Замечу, что structural change - полезное событие для того, чтобы обновить UI, если изменилось дерево модельных объектов. Изменени модельных объектов не вызывает автоматического перерисования UI - у нас нет такого вида событий!

Действия и возможности

Сохранение и открытие проекта

BeanExplorerProjectSource - простейший фасад для сохранения и открытия проекта из YAML.

LegacyBeanExplorerProjectImporter - предоставляет возможность открывать BE3 проект из базы данных.

JavaScript отладчик

com.beanexplorer.enterprise.eclipse.javascript.RunJavaScriptOperationImpl и DebugJavaScriptOperationImpl - основные классы реализации.

Запуск Query

Основывается на Be4QueryExecutor из com.beanexplorer.enterprise.be4core. См. класс "RunQuery" в качестве примера.

Data Tools Platform: Connection Profiles

com.beanexplorer.enterprise.eclipse.model.ConnectionProfiles позволяет преобразовывать наши модельные настройки в DTP connection profile и наоборот.

Поиск в Project View

com.beanexplorer.enterprise.eclipse.jface.DataElementsFilter

Иконки и подсказки в Project View

com.beanexplorer.enterprise.eclipse.views.BeanExplorerProjectViewLabelProvider - вычисляет иконки, рисует простые подсказки и делегирует сложные tooltip'ы (в виде таблиц с ошибками) классу FancyToolTipSupport из того же пакета.

Сохранение состояния view

См. в качестве примера BeanExplorerProjectView.saveState (простейшие примеры - сохранение имени открытого проекта и выделенного элемента) и BeanExplorerProjectView.init (загрузка).

Настройки

См. BeanExplorerPreferencesPage.createFieldEditors и BeanExplorerPreferences из com.beanexplorer.enterprise.eclipse.preferences.BeanExplorerPreferencesPage.

Фоновые процессы

Запуск - new Job("name") { implementation }.schedule(). "Подождать" - пример в BeanExplorerProjectProvider.waitForSynchronization, "отменить" - пример в BeanExplorerProjectSource.cancelOpening. Замечу, что любые действия с UI должны делаться в UI потоке, поэтому для запуска кода в UI потоке из Job можно использовать:

  • UiFunction.async(function) - оборачивает функцию;
  • new AbstractUiSyncFunction<A, R>() { implementation }.apply(arg);
  • EclipseUtils.runInUiThread(runnable) или EclipseUtils.runInUiThread(supplier) - асинхронный и синхронный запуск соответственно.

Подолнительно в EclipseUtils имеются методы для показа окошек с ошибками и предупреждениями из не UI потоков (типа openErrorByNonUiThread).

Утилиты Eclipse

EclispeUtils содержит множество полезных методов, относящихся только к Eclipse UI:

  • открытие или создание Java класса;
  • создание проектов;
  • открытие редакторов, view или wizard по идентификатору;
  • копирование в буфер обмена;
  • получение содержимого редакторов;
  • сохранение открытых редакторов.

Статьи по SWT

Вот здесь вводная статья по SWT - объясняются основные концепции, какие виджеты бывают и как используются layout.

А здесь статья про JFace - библиотеку, упрощающую работу с таблицами и деревьями.