<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.dote.ru/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.dote.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Asko</id>
		<title>DevelopmenOnTheEdge - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.dote.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Asko"/>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Asko"/>
		<updated>2026-06-21T05:02:38Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.23.3</generator>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5</id>
		<title>BeanExplorer5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5"/>
				<updated>2016-05-10T11:06:27Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Backend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Это основная статья о BeanExplorer5.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку эта основная статья недописана, остальная её часть для тех, кто будет дорабатывать BeanExplorer5, а не использовать.&lt;br /&gt;
&lt;br /&gt;
==Концепции и технологии==&lt;br /&gt;
&lt;br /&gt;
Основные технологии, которые мы используем - это Java, Java Servlet, OSGi, React, SystemJS, ES2015 через Babel.&lt;br /&gt;
&lt;br /&gt;
===Frontend===&lt;br /&gt;
&lt;br /&gt;
Основные frontend компоненты написаны на React, но могут быть написаны на чём угодно. Поскольку React - это лишь &amp;quot;V&amp;quot; из MVC, то часть функционала полноценного frontend framework было необходимо реализовать, и этот функционал находится в be5/be5-frontend/src/scripts/be5.js (или просто be5 - далее буду писать имена скриптов кратко). Это покрывает функционал routing, requests, frontend localization. Также полезный базовый функционал находится в be5/bus, be5/createStore, be5/createSimpleStore, be5/ext.&lt;br /&gt;
* bus - сообщения (брокер из паттерна pub/sub); например, bus.fire('DocumentChange', value), bus.listen('DocumentChange', value =&amp;gt; ...);&lt;br /&gt;
* ext - расширения;&lt;br /&gt;
* createStore - создание store для управления данными на frontend; позволяет подписаться на его изменения;&lt;br /&gt;
* createSimpleStore - создание store, полным состоянием которого является результат GET запроса.&lt;br /&gt;
&lt;br /&gt;
Необходимые части frontend подгружаются динамически с помощью SystemJS.&lt;br /&gt;
&lt;br /&gt;
JSX+ES2015 скрипты компилируются с помощью Babel при сборке проекта.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* frontend подготовлен, но не переведён на [https://github.com/reactjs/react-redux redux], а это необходимо для упрощения работы с React компонентами (без redux или Flux бывает довольно нетривиально управлять состоянием React компонентов);&lt;br /&gt;
* be5.js требует разделения на небольшие части, также, как выделены bus и ext;&lt;br /&gt;
* невозможно отказаться от компиляции ES2015, даже если она будет поддерживаться всеми браузерами. SystemJS проверяет наличие ES2015 синтаксиса в скриптах, и в случае его наличия пытается использовать транслятор в браузере, даже если явно указано, что транслятора нет.&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* используйте [https://github.com/reactjs/react-redux redux], [https://facebook.github.io/react/docs/two-way-binding-helpers.html React two-way binding], [https://github.com/JedWatson/classnames React classNames].&lt;br /&gt;
&lt;br /&gt;
===Backend===&lt;br /&gt;
&lt;br /&gt;
Основные части API находятся в com.beanexplorer.enterprise.api. Проще всего начать знакомство с BE5, посмотрев на содержимое этого пакета и его подпакетов. В com.beanexplorer.enterprise.api.experimental.v1 хранятся маленькие полезности. Если они становятся не экспериментальными, а доказавшими полезность, можно переносить их в другие подпакеты api. v1 в названии пакета необходимо для поддержки разного API для одинакового функционала, если невозможно быстро отрефакторить код с экспериментальным функционалом или если хочется проверить, какой подход окажется полезнее.&lt;br /&gt;
&lt;br /&gt;
Сердце всего BE5 - это ServiceProvider. ServiceProvider доступен компонентам, а в конструкторы сервисов инжектируются другие сервисы или сам ServiceProvider.&lt;br /&gt;
&lt;br /&gt;
Good practices:&lt;br /&gt;
* Разделяем модельные элементы на бины без логики, сервисы и репозитории.&lt;br /&gt;
* Презентационный код пишется в компонентах. Если в компоненте много строчек кода, то что-то пошло не так.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* При написании operation почти любая строчка кода приводит к увеличению зависимости от наличия метаданных в БД, а также ухудшению возможности что либо протестировать, равно как и невозможности переиспользовать написанный код. Необходимо новое API для операций, полагающееся на сервисы - содержимого com.beanexplorer.enterprise.api.experimental и com.beanexplorer.enterprise.api.experimental.v1 недостаточно.&lt;br /&gt;
* Нет предусмотренного сетапа для тестирования.&lt;br /&gt;
* Нет API для запросов из БД, которое покрывает все возможные SQL запросы.&lt;br /&gt;
* Мы не избавились от метаданных в базе данных, поскольку BeanExplorer5 использует legacy код, который полагается на наличие метаданных в базе данных.&lt;br /&gt;
* Нет стандартного способа взять запрос из Query (той, что определена в YAML) и запустить его. Дело в том, что концептуально сейчас Query - это запросы, которые используются как запросы для таблиц, которые может увидеть пользователь. Такие запросы помечаются набором ролей, обладатели которых могут запускать запросы. Однако бывает необходимость описать запрос на BE-SQL и запустить его из Java. На мой взгляд не только роли должны игнорироваться, но и вообще такие запросы должны либо где-то в другом месте лежать (например, namedQueries.yaml), либо быть приписанными к Entity и не находиться в разделе queries, а, например, находиться в разделе &amp;quot;systemQueries&amp;quot; (причём поскольку это новые запросы, они никогда не должны попадать в БД, а быть только в in-memory meta/project; сейчас запустить обычную Query через BE-SQL игнорируя роли можно так: executorService.createExecutor(meta.getQueryIgnoringRoles(&amp;quot;entityName&amp;quot;, &amp;quot;queryName&amp;quot;), request, serviceProvider).execute()). Кстати, теперь можно убрать ServiceProvider из последнего аргумента, польскольку он может инжектироваться в ExecutorServiceImpl.&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* Можно ресширить функционал ServiceProvider добавлением способности обрабатывать аннотированные поля сервисов - это избавит от проблем обхода циклических зависимостей сервисов и написания boilderplate в конструкторах. Также возможно попробовать сэмулировать поведение из Spring Core или Google Guice - это бы позволило просто перйти на них при возможности (см. следующее).&lt;br /&gt;
* Можно даже использовать Google Guice или переиспользовать Spring Core, если найдётся хороший способ регистрации сервисов из разных OSGi модулей (сам BE5 и BE5 приложение - в разных OSGi модулях).&lt;br /&gt;
* В идеальном случае было бы хорошо не писать репозитории, да и сервисы для запросов - для этого есть Hibernate, реализации JPA и другие ORM. А ещё лучше - попробовать переиспользовать Spring Data (объявлять интерфейсы с методами, описывающими запрос, без необходимости писать сам код запроса - как personRepository.findByEmailAndActive(&amp;quot;email&amp;quot;, true) - вызов метода из интерфейса, реализацию которого подкладывает Spring).&lt;br /&gt;
* Или хотя бы доделать SQL builder (SqlBuilder) и SQL Service (SqlService), потому что они сейчас не позволяют делать запросы с LEFT JOIN и WITH RECURSIVE.&lt;br /&gt;
* В таком случае было бы хорошо реализовывать код репозиториев с использованием одного универсального парсера из ResultSet в бины (при этом он должен работать по принципу fail-fast, а не как Dynamic.assign(Object bean, DynamicPropertySet dynamicProperties), который игнорирует все ошибки).&lt;br /&gt;
&lt;br /&gt;
==Сборка BeanExplorer5==&lt;br /&gt;
См. [[Сборка BeanExplorer5 проекта|Сборка BeanExplorer5 проекта]].&lt;br /&gt;
&lt;br /&gt;
==BeanExplorer5 API==&lt;br /&gt;
См. [[BeanExplorer5 API|BeanExplorer5 API]]&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5</id>
		<title>BeanExplorer5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5"/>
				<updated>2016-05-10T10:52:07Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Backend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Это основная статья о BeanExplorer5.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку эта основная статья недописана, остальная её часть для тех, кто будет дорабатывать BeanExplorer5, а не использовать.&lt;br /&gt;
&lt;br /&gt;
==Концепции и технологии==&lt;br /&gt;
&lt;br /&gt;
Основные технологии, которые мы используем - это Java, Java Servlet, OSGi, React, SystemJS, ES2015 через Babel.&lt;br /&gt;
&lt;br /&gt;
===Frontend===&lt;br /&gt;
&lt;br /&gt;
Основные frontend компоненты написаны на React, но могут быть написаны на чём угодно. Поскольку React - это лишь &amp;quot;V&amp;quot; из MVC, то часть функционала полноценного frontend framework было необходимо реализовать, и этот функционал находится в be5/be5-frontend/src/scripts/be5.js (или просто be5 - далее буду писать имена скриптов кратко). Это покрывает функционал routing, requests, frontend localization. Также полезный базовый функционал находится в be5/bus, be5/createStore, be5/createSimpleStore, be5/ext.&lt;br /&gt;
* bus - сообщения (брокер из паттерна pub/sub); например, bus.fire('DocumentChange', value), bus.listen('DocumentChange', value =&amp;gt; ...);&lt;br /&gt;
* ext - расширения;&lt;br /&gt;
* createStore - создание store для управления данными на frontend; позволяет подписаться на его изменения;&lt;br /&gt;
* createSimpleStore - создание store, полным состоянием которого является результат GET запроса.&lt;br /&gt;
&lt;br /&gt;
Необходимые части frontend подгружаются динамически с помощью SystemJS.&lt;br /&gt;
&lt;br /&gt;
JSX+ES2015 скрипты компилируются с помощью Babel при сборке проекта.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* frontend подготовлен, но не переведён на [https://github.com/reactjs/react-redux redux], а это необходимо для упрощения работы с React компонентами (без redux или Flux бывает довольно нетривиально управлять состоянием React компонентов);&lt;br /&gt;
* be5.js требует разделения на небольшие части, также, как выделены bus и ext;&lt;br /&gt;
* невозможно отказаться от компиляции ES2015, даже если она будет поддерживаться всеми браузерами. SystemJS проверяет наличие ES2015 синтаксиса в скриптах, и в случае его наличия пытается использовать транслятор в браузере, даже если явно указано, что транслятора нет.&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* используйте [https://github.com/reactjs/react-redux redux], [https://facebook.github.io/react/docs/two-way-binding-helpers.html React two-way binding], [https://github.com/JedWatson/classnames React classNames].&lt;br /&gt;
&lt;br /&gt;
===Backend===&lt;br /&gt;
&lt;br /&gt;
Основные части API находятся в com.beanexplorer.enterprise.api. Проще всего начать знакомство с BE5, посмотрев на содержимое этого пакета и его подпакетов. В com.beanexplorer.enterprise.api.experimental.v1 хранятся маленькие полезности. Если они становятся не экспериментальными, а доказавшими полезность, можно переносить их в другие подпакеты api. v1 в названии пакета необходимо для поддержки разного API для одинакового функционала, если невозможно быстро отрефакторить код с экспериментальным функционалом или если хочется проверить, какой подход окажется полезнее.&lt;br /&gt;
&lt;br /&gt;
Сердце всего BE5 - это ServiceProvider. ServiceProvider доступен компонентам, а в конструкторы сервисов инжектируются другие сервисы или сам ServiceProvider.&lt;br /&gt;
&lt;br /&gt;
Good practices:&lt;br /&gt;
* Разделяем модельные элементы на бины без логики, сервисы и репозитории.&lt;br /&gt;
* Презентационный код пишется в компонентах. Если в компоненте много строчек кода, то что-то пошло не так.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* При написании operation почти любая строчка кода приводит к увеличению зависимости от наличия метаданных в БД, а также ухудшению возможности что либо протестировать, равно как и невозможности переиспользовать написанный код. Необходимо новое API для операций, полагающееся на сервисы - содержимого com.beanexplorer.enterprise.api.experimental и com.beanexplorer.enterprise.api.experimental.v1 недостаточно.&lt;br /&gt;
* Нет предусмотренного сетапа для тестирования.&lt;br /&gt;
* Нет API для запросов из БД, которое покрывает все возможные SQL запросы.&lt;br /&gt;
* Мы не избавились от метаданных в базе данных, поскольку BeanExplorer5 использует legacy код, который полагается на наличие метаданных в базе данных.&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* Можно ресширить функционал ServiceProvider добавлением способности обрабатывать аннотированные поля сервисов - это избавит от проблем обхода циклических зависимостей сервисов и написания boilderplate в конструкторах. Также возможно попробовать сэмулировать поведение из Spring Core или Google Guice - это бы позволило просто перйти на них при возможности (см. следующее).&lt;br /&gt;
* Можно даже использовать Google Guice или переиспользовать Spring Core, если найдётся хороший способ регистрации сервисов из разных OSGi модулей (сам BE5 и BE5 приложение - в разных OSGi модулях).&lt;br /&gt;
* В идеальном случае было бы хорошо не писать репозитории, да и сервисы для запросов - для этого есть Hibernate, реализации JPA и другие ORM. А ещё лучше - попробовать переиспользовать Spring Data (объявлять интерфейсы с методами, описывающими запрос, без необходимости писать сам код запроса - как personRepository.findByEmailAndActive(&amp;quot;email&amp;quot;, true) - вызов метода из интерфейса, реализацию которого подкладывает Spring).&lt;br /&gt;
* Или хотя бы доделать SQL builder (SqlBuilder) и SQL Service (SqlService), потому что они сейчас не позволяют делать запросы с LEFT JOIN и WITH RECURSIVE.&lt;br /&gt;
* В таком случае было бы хорошо реализовывать код репозиториев с использованием одного универсального парсера из ResultSet в бины (при этом он должен работать по принципу fail-fast, а не как Dynamic.assign(Object bean, DynamicPropertySet dynamicProperties), который игнорирует все ошибки).&lt;br /&gt;
&lt;br /&gt;
==Сборка BeanExplorer5==&lt;br /&gt;
См. [[Сборка BeanExplorer5 проекта|Сборка BeanExplorer5 проекта]].&lt;br /&gt;
&lt;br /&gt;
==BeanExplorer5 API==&lt;br /&gt;
См. [[BeanExplorer5 API|BeanExplorer5 API]]&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5</id>
		<title>BeanExplorer5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5"/>
				<updated>2016-05-10T10:47:32Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Frontend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Это основная статья о BeanExplorer5.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку эта основная статья недописана, остальная её часть для тех, кто будет дорабатывать BeanExplorer5, а не использовать.&lt;br /&gt;
&lt;br /&gt;
==Концепции и технологии==&lt;br /&gt;
&lt;br /&gt;
Основные технологии, которые мы используем - это Java, Java Servlet, OSGi, React, SystemJS, ES2015 через Babel.&lt;br /&gt;
&lt;br /&gt;
===Frontend===&lt;br /&gt;
&lt;br /&gt;
Основные frontend компоненты написаны на React, но могут быть написаны на чём угодно. Поскольку React - это лишь &amp;quot;V&amp;quot; из MVC, то часть функционала полноценного frontend framework было необходимо реализовать, и этот функционал находится в be5/be5-frontend/src/scripts/be5.js (или просто be5 - далее буду писать имена скриптов кратко). Это покрывает функционал routing, requests, frontend localization. Также полезный базовый функционал находится в be5/bus, be5/createStore, be5/createSimpleStore, be5/ext.&lt;br /&gt;
* bus - сообщения (брокер из паттерна pub/sub); например, bus.fire('DocumentChange', value), bus.listen('DocumentChange', value =&amp;gt; ...);&lt;br /&gt;
* ext - расширения;&lt;br /&gt;
* createStore - создание store для управления данными на frontend; позволяет подписаться на его изменения;&lt;br /&gt;
* createSimpleStore - создание store, полным состоянием которого является результат GET запроса.&lt;br /&gt;
&lt;br /&gt;
Необходимые части frontend подгружаются динамически с помощью SystemJS.&lt;br /&gt;
&lt;br /&gt;
JSX+ES2015 скрипты компилируются с помощью Babel при сборке проекта.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* frontend подготовлен, но не переведён на [https://github.com/reactjs/react-redux redux], а это необходимо для упрощения работы с React компонентами (без redux или Flux бывает довольно нетривиально управлять состоянием React компонентов);&lt;br /&gt;
* be5.js требует разделения на небольшие части, также, как выделены bus и ext;&lt;br /&gt;
* невозможно отказаться от компиляции ES2015, даже если она будет поддерживаться всеми браузерами. SystemJS проверяет наличие ES2015 синтаксиса в скриптах, и в случае его наличия пытается использовать транслятор в браузере, даже если явно указано, что транслятора нет.&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* используйте [https://github.com/reactjs/react-redux redux], [https://facebook.github.io/react/docs/two-way-binding-helpers.html React two-way binding], [https://github.com/JedWatson/classnames React classNames].&lt;br /&gt;
&lt;br /&gt;
===Backend===&lt;br /&gt;
&lt;br /&gt;
Основные части API находятся в com.beanexplorer.enterprise.api. Проще всего начать знакомство с BE5, посмотрев на содержимое этого пакета и его подпакетов. В com.beanexplorer.enterprise.api.experimental.v1 хранятся маленькие полезности. Если они становятся не экспериментальными, а доказавшими полезность, можно переносить их в другие подпакеты api. v1 в названии пакета необходимо для поддержки разного API для одинакового функционала, если невозможно быстро отрефакторить код с экспериментальным функционалом или если хочется проверить, какой подход окажется полезнее.&lt;br /&gt;
&lt;br /&gt;
Сердце всего BE5 - это ServiceProvider. ServiceProvider доступен компонентам, а в конструкторы сервисов инжектируются другие сервисы или сам ServiceProvider.&lt;br /&gt;
&lt;br /&gt;
Good practices:&lt;br /&gt;
* Разделяем модельные элементы на бины без логики, сервисы и репозитории.&lt;br /&gt;
* Презентационный код пишется в компонентах. Если в компоненте много строчек кода, то что-то пошло не так.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* При написании operation почти любая строчка кода приводит к увеличению зависимости от наличия метаданных в БД, а также ухудшению возможности что либо протестировать, равно как и невозможности переиспользовать написанный код. Необходимо новое API для операций, полагающееся на сервисы - содержимого com.beanexplorer.enterprise.api.experimental и com.beanexplorer.enterprise.api.experimental.v1 недостаточно.&lt;br /&gt;
* Нет предусмотренного сетапа для тестирования.&lt;br /&gt;
* Нет API для запросов из БД, которое покрывает все возможные SQL запросы.&lt;br /&gt;
* Мы не избавились от метаданных в базе данных, поскольку BeanExplorer5 использует legacy код, который полагается на наличие метаданных в базе данных.&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* Можно ресширить функционал ServiceProvider добавлением способности обрабатывать аннотированные поля сервисов - это избавит от проблем обхода циклических зависимостей сервисов и написания boilderplate в конструкторах. Также возможно попробовать сэмулировать поведение из Spring Core или Google Guice - это бы позволило просто перйти на них при возможности (см. следующее).&lt;br /&gt;
* Можно даже использовать Google Guice или переиспользовать Spring Core, если найдётся хороший способ регистрации сервисов из разных OSGi модулей (сам BE5 и BE5 приложение - в разных OSGi модулях).&lt;br /&gt;
* В идеальном случае было бы хорошо не писать репозитории, да и сервисы для запросов - для этого есть Hibernate, реализации JPA и другие ORM. А ещё лучше - попробовать переиспользовать Spring Data (объявлять интерфейсы с методами, описывающими запрос, без необходимости писать сам код запроса - как personRepository.findByEmailAndActive(&amp;quot;email&amp;quot;, true) - вызов метода из интерфейса, реализацию которого подкладывает Spring).&lt;br /&gt;
* Или хотя бы доделать SQL builder (SqlBuilder) и SQL Service (SqlService), потому что они сейчас не позволяют делать запросы с LEFT JOIN и WITH RECURSIVE.&lt;br /&gt;
&lt;br /&gt;
==Сборка BeanExplorer5==&lt;br /&gt;
См. [[Сборка BeanExplorer5 проекта|Сборка BeanExplorer5 проекта]].&lt;br /&gt;
&lt;br /&gt;
==BeanExplorer5 API==&lt;br /&gt;
См. [[BeanExplorer5 API|BeanExplorer5 API]]&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5</id>
		<title>BeanExplorer5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5"/>
				<updated>2016-05-10T10:45:46Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Концепции */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Это основная статья о BeanExplorer5.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку эта основная статья недописана, остальная её часть для тех, кто будет дорабатывать BeanExplorer5, а не использовать.&lt;br /&gt;
&lt;br /&gt;
==Концепции и технологии==&lt;br /&gt;
&lt;br /&gt;
Основные технологии, которые мы используем - это Java, Java Servlet, OSGi, React, SystemJS, ES2015 через Babel.&lt;br /&gt;
&lt;br /&gt;
===Frontend===&lt;br /&gt;
&lt;br /&gt;
Основные frontend компоненты написаны на React, но могут быть написаны на чём угодно. Поскольку React - это лишь &amp;quot;V&amp;quot; из MVC, то часть функционала полноценного frontend framework было необходимо реализовать, и этот функционал находится в be5/be5-frontend/src/scripts/be5.js (или просто be5 - далее буду писать имена скриптов кратко). Это покрывает функционал routing, requests, frontend localization. Также полезный базовый функционал находится в be5/bus, be5/createStore, be5/createSimpleStore, be5/ext.&lt;br /&gt;
* bus - сообщения (брокер из паттерна pub/sub); например, bus.fire('DocumentChange', value), bus.listen('DocumentChange', value =&amp;gt; ...);&lt;br /&gt;
* ext - расширения;&lt;br /&gt;
* createStore - создание store для управления данными на frontend; позволяет подписаться на его изменения;&lt;br /&gt;
* createSimpleStore - создание store, полным состоянием которого является результат GET запроса.&lt;br /&gt;
&lt;br /&gt;
Необходимые части frontend подгружаются динамически с помощью SystemJS.&lt;br /&gt;
&lt;br /&gt;
JSX+ES2015 скрипты компилируются с помощью Babel при сборке проекта.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* frontend подготовлен, но не переведён на [https://github.com/reactjs/react-redux redux], а это необходимо для упрощения работы с React компонентами (без redux или Flux бывает довольно нетривиально управлять состоянием React компонентов);&lt;br /&gt;
* be5.js требует разделения на небольшие части, также, как выделены bus и ext;&lt;br /&gt;
* невозможно отказаться от компиляции ES2015, даже если она будет поддерживаться всеми браузерами. SystemJS проверяет наличие ES2015 синтаксиса в скриптах, и в случае его наличия потается использовать транслятор в браузере, даже если явно указано, что транслятора нет&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* используйте [https://github.com/reactjs/react-redux redux], [https://facebook.github.io/react/docs/two-way-binding-helpers.html React two-way binding], [https://github.com/JedWatson/classnames React classNames].&lt;br /&gt;
&lt;br /&gt;
===Backend===&lt;br /&gt;
&lt;br /&gt;
Основные части API находятся в com.beanexplorer.enterprise.api. Проще всего начать знакомство с BE5, посмотрев на содержимое этого пакета и его подпакетов. В com.beanexplorer.enterprise.api.experimental.v1 хранятся маленькие полезности. Если они становятся не экспериментальными, а доказавшими полезность, можно переносить их в другие подпакеты api. v1 в названии пакета необходимо для поддержки разного API для одинакового функционала, если невозможно быстро отрефакторить код с экспериментальным функционалом или если хочется проверить, какой подход окажется полезнее.&lt;br /&gt;
&lt;br /&gt;
Сердце всего BE5 - это ServiceProvider. ServiceProvider доступен компонентам, а в конструкторы сервисов инжектируются другие сервисы или сам ServiceProvider.&lt;br /&gt;
&lt;br /&gt;
Good practices:&lt;br /&gt;
* Разделяем модельные элементы на бины без логики, сервисы и репозитории.&lt;br /&gt;
* Презентационный код пишется в компонентах. Если в компоненте много строчек кода, то что-то пошло не так.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* При написании operation почти любая строчка кода приводит к увеличению зависимости от наличия метаданных в БД, а также ухудшению возможности что либо протестировать, равно как и невозможности переиспользовать написанный код. Необходимо новое API для операций, полагающееся на сервисы - содержимого com.beanexplorer.enterprise.api.experimental и com.beanexplorer.enterprise.api.experimental.v1 недостаточно.&lt;br /&gt;
* Нет предусмотренного сетапа для тестирования.&lt;br /&gt;
* Нет API для запросов из БД, которое покрывает все возможные SQL запросы.&lt;br /&gt;
* Мы не избавились от метаданных в базе данных, поскольку BeanExplorer5 использует legacy код, который полагается на наличие метаданных в базе данных.&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* Можно ресширить функционал ServiceProvider добавлением способности обрабатывать аннотированные поля сервисов - это избавит от проблем обхода циклических зависимостей сервисов и написания boilderplate в конструкторах. Также возможно попробовать сэмулировать поведение из Spring Core или Google Guice - это бы позволило просто перйти на них при возможности (см. следующее).&lt;br /&gt;
* Можно даже использовать Google Guice или переиспользовать Spring Core, если найдётся хороший способ регистрации сервисов из разных OSGi модулей (сам BE5 и BE5 приложение - в разных OSGi модулях).&lt;br /&gt;
* В идеальном случае было бы хорошо не писать репозитории, да и сервисы для запросов - для этого есть Hibernate, реализации JPA и другие ORM. А ещё лучше - попробовать переиспользовать Spring Data (объявлять интерфейсы с методами, описывающими запрос, без необходимости писать сам код запроса - как personRepository.findByEmailAndActive(&amp;quot;email&amp;quot;, true) - вызов метода из интерфейса, реализацию которого подкладывает Spring).&lt;br /&gt;
* Или хотя бы доделать SQL builder (SqlBuilder) и SQL Service (SqlService), потому что они сейчас не позволяют делать запросы с LEFT JOIN и WITH RECURSIVE.&lt;br /&gt;
&lt;br /&gt;
==Сборка BeanExplorer5==&lt;br /&gt;
См. [[Сборка BeanExplorer5 проекта|Сборка BeanExplorer5 проекта]].&lt;br /&gt;
&lt;br /&gt;
==BeanExplorer5 API==&lt;br /&gt;
См. [[BeanExplorer5 API|BeanExplorer5 API]]&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5</id>
		<title>BeanExplorer5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5"/>
				<updated>2016-05-10T10:44:10Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Это основная статья о BeanExplorer5.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку эта основная статья недописана, остальная её часть для тех, кто будет дорабатывать BeanExplorer5, а не использовать.&lt;br /&gt;
&lt;br /&gt;
==Концепции==&lt;br /&gt;
&lt;br /&gt;
Основные технологии, которые мы используем - это Java, Java Servlet, OSGi, React, SystemJS, ES2015 через Babel.&lt;br /&gt;
&lt;br /&gt;
===Frontend===&lt;br /&gt;
&lt;br /&gt;
Основные frontend компоненты написаны на React, но могут быть написаны на чём угодно. Поскольку React - это лишь &amp;quot;V&amp;quot; из MVC, то часть функционала полноценного frontend framework было необходимо реализовать, и этот функционал находится в be5/be5-frontend/src/scripts/be5.js (или просто be5 - далее буду писать имена скриптов кратко). Это покрывает функционал routing, requests, frontend localization. Также полезный базовый функционал находится в be5/bus, be5/createStore, be5/createSimpleStore, be5/ext.&lt;br /&gt;
* bus - сообщения (брокер из паттерна pub/sub); например, bus.fire('DocumentChange', value), bus.listen('DocumentChange', value =&amp;gt; ...);&lt;br /&gt;
* ext - расширения;&lt;br /&gt;
* createStore - создание store для управления данными на frontend; позволяет подписаться на его изменения;&lt;br /&gt;
* createSimpleStore - создание store, полным состоянием которого является результат GET запроса.&lt;br /&gt;
&lt;br /&gt;
Необходимые части frontend подгружаются динамически с помощью SystemJS.&lt;br /&gt;
&lt;br /&gt;
JSX+ES2015 скрипты компилируются с помощью Babel при сборке проекта.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* frontend подготовлен, но не переведён на [https://github.com/reactjs/react-redux redux], а это необходимо для упрощения работы с React компонентами (без redux или Flux бывает довольно нетривиально управлять состоянием React компонентов);&lt;br /&gt;
* be5.js требует разделения на небольшие части, также, как выделены bus и ext;&lt;br /&gt;
* невозможно отказаться от компиляции ES2015, даже если она будет поддерживаться всеми браузерами. SystemJS проверяет наличие ES2015 синтаксиса в скриптах, и в случае его наличия потается использовать транслятор в браузере, даже если явно указано, что транслятора нет&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* используйте [https://github.com/reactjs/react-redux redux], [https://facebook.github.io/react/docs/two-way-binding-helpers.html React two-way binding], [https://github.com/JedWatson/classnames React classNames].&lt;br /&gt;
&lt;br /&gt;
===Backend===&lt;br /&gt;
&lt;br /&gt;
Основные части API находятся в com.beanexplorer.enterprise.api. Проще всего начать знакомство с BE5, посмотрев на содержимое этого пакета и его подпакетов. В com.beanexplorer.enterprise.api.experimental.v1 хранятся маленькие полезности. Если они становятся не экспериментальными, а доказавшими полезность, можно переносить их в другие подпакеты api. v1 в названии пакета необходимо для поддержки разного API для одинакового функционала, если невозможно быстро отрефакторить код с экспериментальным функционалом или если хочется проверить, какой подход окажется полезнее.&lt;br /&gt;
&lt;br /&gt;
Сердце всего BE5 - это ServiceProvider. ServiceProvider доступен компонентам, а в конструкторы сервисов инжектируются другие сервисы или сам ServiceProvider.&lt;br /&gt;
&lt;br /&gt;
Good practices:&lt;br /&gt;
* Разделяем модельные элементы на бины без логики, сервисы и репозитории.&lt;br /&gt;
* Презентационный код пишется в компонентах. Если в компоненте много строчек кода, то что-то пошло не так.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* При написании operation почти любая строчка кода приводит к увеличению зависимости от наличия метаданных в БД, а также ухудшению возможности что либо протестировать, равно как и невозможности переиспользовать написанный код. Необходимо новое API для операций, полагающееся на сервисы - содержимого com.beanexplorer.enterprise.api.experimental и com.beanexplorer.enterprise.api.experimental.v1 недостаточно.&lt;br /&gt;
* Нет предусмотренного сетапа для тестирования.&lt;br /&gt;
* Нет API для запросов из БД, которое покрывает все возможные SQL запросы.&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* Можно ресширить функционал ServiceProvider добавлением способности обрабатывать аннотированные поля сервисов - это избавит от проблем обхода циклических зависимостей сервисов и написания boilderplate в конструкторах. Также возможно попробовать сэмулировать поведение из Spring Core или Google Guice - это бы позволило просто перйти на них при возможности (см. следующее).&lt;br /&gt;
* Можно даже использовать Google Guice или переиспользовать Spring Core, если найдётся хороший способ регистрации сервисов из разных OSGi модулей (сам BE5 и BE5 приложение - в разных OSGi модулях).&lt;br /&gt;
* В идеальном случае было бы хорошо не писать репозитории, да и сервисы для запросов - для этого есть Hibernate, реализации JPA и другие ORM. А ещё лучше - попробовать переиспользовать Spring Data (объявлять интерфейсы с методами, описывающими запрос, без необходимости писать сам код запроса - как personRepository.findByEmailAndActive(&amp;quot;email&amp;quot;, true) - вызов метода из интерфейса, реализацию которого подкладывает Spring).&lt;br /&gt;
* Или хотя бы доделать SQL builder (SqlBuilder) и SQL Service (SqlService), потому что они сейчас не позволяют делать запросы с LEFT JOIN и WITH RECURSIVE.&lt;br /&gt;
&lt;br /&gt;
==Сборка BeanExplorer5==&lt;br /&gt;
См. [[Сборка BeanExplorer5 проекта|Сборка BeanExplorer5 проекта]].&lt;br /&gt;
&lt;br /&gt;
==BeanExplorer5 API==&lt;br /&gt;
См. [[BeanExplorer5 API|BeanExplorer5 API]]&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5</id>
		<title>BeanExplorer5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5"/>
				<updated>2016-05-10T10:38:13Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Backend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Это основная статья о BeanExplorer5.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание API [[BeanExplorer5 API|здесь]]. Поскольку эта основная статья недописана, остальная её часть статьи написана для тех, кто будет дорабатывать BeanExplorer5.&lt;br /&gt;
&lt;br /&gt;
==Концепции==&lt;br /&gt;
&lt;br /&gt;
Основные технологии, которые мы используем - это Java, Java Servlet, OSGi, React, SystemJS, ES2015 через Babel.&lt;br /&gt;
&lt;br /&gt;
===Frontend===&lt;br /&gt;
&lt;br /&gt;
Основные frontend компоненты написаны на React, но могут быть написаны на чём угодно. Поскольку React - это лишь &amp;quot;V&amp;quot; из MVC, то часть функционала полноценного frontend framework было необходимо реализовать, и этот функционал находится в be5/be5-frontend/src/scripts/be5.js (или просто be5 - далее буду писать имена скриптов кратко). Это покрывает функционал routing, requests, frontend localization. Также полезный базовый функционал находится в be5/bus, be5/createStore, be5/createSimpleStore, be5/ext.&lt;br /&gt;
* bus - сообщения (брокер из паттерна pub/sub); например, bus.fire('DocumentChange', value), bus.listen('DocumentChange', value =&amp;gt; ...);&lt;br /&gt;
* ext - расширения;&lt;br /&gt;
* createStore - создание store для управления данными на frontend; позволяет подписаться на его изменения;&lt;br /&gt;
* createSimpleStore - создание store, полным состоянием которого является результат GET запроса.&lt;br /&gt;
&lt;br /&gt;
Необходимые части frontend подгружаются динамически с помощью SystemJS.&lt;br /&gt;
&lt;br /&gt;
JSX+ES2015 скрипты компилируются с помощью Babel при сборке проекта.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* frontend подготовлен, но не переведён на [https://github.com/reactjs/react-redux redux], а это необходимо для упрощения работы с React компонентами (без redux или Flux бывает довольно нетривиально управлять состоянием React компонентов);&lt;br /&gt;
* be5.js требует разделения на небольшие части, также, как выделены bus и ext;&lt;br /&gt;
* невозможно отказаться от компиляции ES2015, даже если она будет поддерживаться всеми браузерами. SystemJS проверяет наличие ES2015 синтаксиса в скриптах, и в случае его наличия потается использовать транслятор в браузере, даже если явно указано, что транслятора нет&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* используйте [https://github.com/reactjs/react-redux redux], [https://facebook.github.io/react/docs/two-way-binding-helpers.html React two-way binding], [https://github.com/JedWatson/classnames React classNames].&lt;br /&gt;
&lt;br /&gt;
===Backend===&lt;br /&gt;
&lt;br /&gt;
Основные части API находятся в com.beanexplorer.enterprise.api. Проще всего начать знакомство с BE5, посмотрев на содержимое этого пакета и его подпакетов. В com.beanexplorer.enterprise.api.experimental.v1 хранятся маленькие полезности. Если они становятся не экспериментальными, а доказавшими полезность, можно переносить их в другие подпакеты api. v1 в названии пакета необходимо для поддержки разного API для одинакового функционала, если невозможно быстро отрефакторить код с экспериментальным функционалом или если хочется проверить, какой подход окажется полезнее.&lt;br /&gt;
&lt;br /&gt;
Сердце всего BE5 - это ServiceProvider. ServiceProvider доступен компонентам, а в конструкторы сервисов инжектируются другие сервисы или сам ServiceProvider.&lt;br /&gt;
&lt;br /&gt;
Good practices:&lt;br /&gt;
* Разделяем модельные элементы на бины без логики, сервисы и репозитории.&lt;br /&gt;
* Презентационный код пишется в компонентах. Если в компоненте много строчек кода, то что-то пошло не так.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* При написании operation почти любая строчка кода приводит к увеличению зависимости от наличия метаданных в БД, а также ухудшению возможности что либо протестировать, равно как и невозможности переиспользовать написанный код. Необходимо новое API для операций, полагающееся на сервисы - содержимого com.beanexplorer.enterprise.api.experimental и com.beanexplorer.enterprise.api.experimental.v1 недостаточно.&lt;br /&gt;
* Нет предусмотренного сетапа для тестирования.&lt;br /&gt;
* Нет API для запросов из БД, которое покрывает все возможные SQL запросы.&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* Можно ресширить функционал ServiceProvider добавлением способности обрабатывать аннотированные поля сервисов - это избавит от проблем обхода циклических зависимостей сервисов и написания boilderplate в конструкторах. Также возможно попробовать сэмулировать поведение из Spring Core или Google Guice - это бы позволило просто перйти на них при возможности (см. следующее).&lt;br /&gt;
* Можно даже использовать Google Guice или переиспользовать Spring Core, если найдётся хороший способ регистрации сервисов из разных OSGi модулей (сам BE5 и BE5 приложение - в разных OSGi модулях).&lt;br /&gt;
* В идеальном случае было бы хорошо не писать репозитории, да и сервисы для запросов - для этого есть Hibernate, реализации JPA и другие ORM. А ещё лучше - попробовать переиспользовать Spring Data (объявлять интерфейсы с методами, описывающими запрос, без необходимости писать сам код запроса - как personRepository.findByEmailAndActive(&amp;quot;email&amp;quot;, true) - вызов метода из интерфейса, реализацию которого подкладывает Spring).&lt;br /&gt;
* Или хотя бы доделать SQL builder (SqlBuilder) и SQL Service (SqlService), потому что они сейчас не позволяют делать запросы с LEFT JOIN и WITH RECURSIVE.&lt;br /&gt;
&lt;br /&gt;
==Сборка BeanExplorer5==&lt;br /&gt;
См. [[Сборка BeanExplorer5 проекта|Сборка BeanExplorer5 проекта]].&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5</id>
		<title>BeanExplorer5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5"/>
				<updated>2016-05-10T10:35:27Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Концепции */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Это основная статья о BeanExplorer5.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание API [[BeanExplorer5 API|здесь]]. Поскольку эта основная статья недописана, остальная её часть статьи написана для тех, кто будет дорабатывать BeanExplorer5.&lt;br /&gt;
&lt;br /&gt;
==Концепции==&lt;br /&gt;
&lt;br /&gt;
Основные технологии, которые мы используем - это Java, Java Servlet, OSGi, React, SystemJS, ES2015 через Babel.&lt;br /&gt;
&lt;br /&gt;
===Frontend===&lt;br /&gt;
&lt;br /&gt;
Основные frontend компоненты написаны на React, но могут быть написаны на чём угодно. Поскольку React - это лишь &amp;quot;V&amp;quot; из MVC, то часть функционала полноценного frontend framework было необходимо реализовать, и этот функционал находится в be5/be5-frontend/src/scripts/be5.js (или просто be5 - далее буду писать имена скриптов кратко). Это покрывает функционал routing, requests, frontend localization. Также полезный базовый функционал находится в be5/bus, be5/createStore, be5/createSimpleStore, be5/ext.&lt;br /&gt;
* bus - сообщения (брокер из паттерна pub/sub); например, bus.fire('DocumentChange', value), bus.listen('DocumentChange', value =&amp;gt; ...);&lt;br /&gt;
* ext - расширения;&lt;br /&gt;
* createStore - создание store для управления данными на frontend; позволяет подписаться на его изменения;&lt;br /&gt;
* createSimpleStore - создание store, полным состоянием которого является результат GET запроса.&lt;br /&gt;
&lt;br /&gt;
Необходимые части frontend подгружаются динамически с помощью SystemJS.&lt;br /&gt;
&lt;br /&gt;
JSX+ES2015 скрипты компилируются с помощью Babel при сборке проекта.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* frontend подготовлен, но не переведён на [https://github.com/reactjs/react-redux redux], а это необходимо для упрощения работы с React компонентами (без redux или Flux бывает довольно нетривиально управлять состоянием React компонентов);&lt;br /&gt;
* be5.js требует разделения на небольшие части, также, как выделены bus и ext;&lt;br /&gt;
* невозможно отказаться от компиляции ES2015, даже если она будет поддерживаться всеми браузерами. SystemJS проверяет наличие ES2015 синтаксиса в скриптах, и в случае его наличия потается использовать транслятор в браузере, даже если явно указано, что транслятора нет&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* используйте [https://github.com/reactjs/react-redux redux], [https://facebook.github.io/react/docs/two-way-binding-helpers.html React two-way binding], [https://github.com/JedWatson/classnames React classNames].&lt;br /&gt;
&lt;br /&gt;
===Backend===&lt;br /&gt;
&lt;br /&gt;
Основные части API находятся в com.beanexplorer.enterprise.api. Проще всего начать знакомство с BE5, посмотрев на содержимое этого пакета и его подпакетов. В com.beanexplorer.enterprise.api.experimental.v1 хранятся маленькие полезности. Если они становятся не экспериментальными, а доказавшими полезность, можно переносить их в другие подпакеты api. v1 в названии пакета необходимо для поддержки разного API для одинакового функционала, если невозможно быстро отрефакторить код с экспериментальным функционалом или если хочется проверить, какой подход окажется полезнее.&lt;br /&gt;
&lt;br /&gt;
Сердце всего BE5 - это ServiceProvider. ServiceProvider доступен компонентам, а в конструкторы сервисов инжектируются другие сервисы или сам ServiceProvider.&lt;br /&gt;
&lt;br /&gt;
Good practices:&lt;br /&gt;
* Разделяем модельные элементы на бины без логики, сервисы и репозитории.&lt;br /&gt;
* Презентационный код пишется в компонентах. Если в компоненте много строчек кода, то что-то пошло не так.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* При написании operation почти любая строчка кода приводит к увеличению зависимости от наличия метаданных в БД, а также ухудшению возможности что либо протестировать, равно как и невозможности переиспользовать написанный код. Необходимо новое API для операций, полагающееся на сервисы - содержимого com.beanexplorer.enterprise.api.experimental и com.beanexplorer.enterprise.api.experimental.v1 недостаточно.&lt;br /&gt;
* Нет предусмотренного сетапа для тестирования.&lt;br /&gt;
* Нет API для запросов из БД, которое покрывает все возможные SQL запросы.&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* Можно ресширить функционал ServiceProvider добавлением способности обрабатывать аннотированные поля сервисов - это избавит от проблем обхода циклических зависимостей сервисов и написания boilderplate в конструкторах. Также возможно попробовать сэмулировать поведение из Spring Core или Google Guice - это бы позволило просто перйти на них при возможности (см. следующее).&lt;br /&gt;
* Можно даже использовать Google Guice или переиспользовать Spring Core, если найдётся хороший способ регистрации сервисов из разных OSGi модулей (сам BE5 и BE5 приложение - в разных OSGi модулях).&lt;br /&gt;
* В идеальном случае было бы хорошо не писать репозитории, да и сервисы для запросов - для этого есть Hibernate, реализации JPA и другие ORM. А ещё лучше - попробовать переиспользовать Spring Data (объявлять интерфейсы с методами, описывающими запрос, без необходимости писать сам код запроса - как personRepository.findByEmailAndActive(&amp;quot;email&amp;quot;, true) - вызов метода из интерфейса, реализацию которого подкладывает Spring).&lt;br /&gt;
* Или хотя бы доделать SQL builder и SqlService, потому что они сейчас не позволяют делать запросы с LEFT JOIN и WITH RECURSIVE.&lt;br /&gt;
&lt;br /&gt;
==Сборка BeanExplorer5==&lt;br /&gt;
См. [[Сборка BeanExplorer5 проекта|Сборка BeanExplorer5 проекта]].&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5</id>
		<title>BeanExplorer5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5"/>
				<updated>2016-05-10T10:10:51Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Это основная статья о BeanExplorer5.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание API [[BeanExplorer5 API|здесь]]. Поскольку эта основная статья недописана, остальная её часть статьи написана для тех, кто будет дорабатывать BeanExplorer5.&lt;br /&gt;
&lt;br /&gt;
==Концепции==&lt;br /&gt;
&lt;br /&gt;
Основные технологии, которые мы используем - это Java, Java Servlet, OSGi, React, SystemJS, ES2015 через Babel.&lt;br /&gt;
&lt;br /&gt;
===Frontend===&lt;br /&gt;
&lt;br /&gt;
Основные frontend компоненты написаны на React, но могут быть написаны на чём угодно. Поскольку React - это лишь &amp;quot;V&amp;quot; из MVC, то часть функционала полноценного frontend framework было необходимо реализовать, и этот функционал находится в be5/be5-frontend/src/scripts/be5.js (или просто be5 - далее буду писать имена скриптов кратко). Это покрывает функционал routing, requests, frontend localization. Также полезный базовый функционал находится в be5/bus, be5/createStore, be5/createSimpleStore, be5/ext.&lt;br /&gt;
* bus - сообщения (брокер из паттерна pub/sub); например, bus.fire('DocumentChange', value), bus.listen('DocumentChange', value =&amp;gt; ...);&lt;br /&gt;
* ext - расширения;&lt;br /&gt;
* createStore - создание store для управления данными на frontend; позволяет подписаться на его изменения;&lt;br /&gt;
* createSimpleStore - создание store, полным состоянием которого является результат GET запроса.&lt;br /&gt;
&lt;br /&gt;
Необходимые части frontend подгружаются динамически с помощью SystemJS.&lt;br /&gt;
&lt;br /&gt;
JSX+ES2015 скрипты компилируются с помощью Babel при сборке проекта.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* frontend подготовлен, но не переведён на [https://github.com/reactjs/react-redux redux], а это необходимо для упрощения работы с React компонентами (без redux или Flux бывает довольно нетривиально управлять состоянием React компонентов);&lt;br /&gt;
* be5.js требует разделения на небольшие части, также, как выделены bus и ext;&lt;br /&gt;
* невозможно отказаться от компиляции ES2015, даже если она будет поддерживаться всеми браузерами. SystemJS проверяет наличие ES2015 синтаксиса в скриптах, и в случае его наличия потается использовать транслятор в браузере, даже если явно указано, что транслятора нет&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* используйте [https://github.com/reactjs/react-redux redux], [https://facebook.github.io/react/docs/two-way-binding-helpers.html React two-way binding], [https://github.com/JedWatson/classnames React classNames].&lt;br /&gt;
&lt;br /&gt;
==Сборка BeanExplorer5==&lt;br /&gt;
См. [[Сборка BeanExplorer5 проекта|Сборка BeanExplorer5 проекта]].&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4</id>
		<title>Компиляция и запуск BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4"/>
				<updated>2016-01-25T08:37:10Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Простой запуск */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Простой запуск ===&lt;br /&gt;
Простой запуск:&lt;br /&gt;
# убедиться, что установлена Java 8 (JRE достаточно);&lt;br /&gt;
# поместить исходники be4 в C:\projects\java\be4;&lt;br /&gt;
# взять Eclipse IDE for Java EE Developers, Eclipse Luna SR2 из этой папки: \\logrus.dote.ru\pub2\be4;&lt;br /&gt;
# отсюда же устанавливаем наши плагины, для этого заходим в Help -&amp;gt; Install New Software..., Add... копируем file:////logrus.dote.ru/pub2/be4/com.beanexplorer.be4.site/ в Location, OK, снимаем галочку Group items by category (если список фич пуст), ставим галочку на BeanExplorer4, Next и т.д.&lt;br /&gt;
&lt;br /&gt;
После перезагрузки Eclipse для работы с BE4 нужно будет выбрать перспективу BeanExplorer. При этом (или же при запуске Eclipse) Eclipse спросит, откуда взять исходники be4, если не догадается об их местоположении. В случае, если be4 находится в C:\projects\java\be4, то всё должно происходить само. Эти исходники нужны только для загрузки модулей.&lt;br /&gt;
&lt;br /&gt;
Известный баг: если be4 помещён не в C:\projects\java\be4, то Eclipse каждый раз при запуске будет спрашивать местонахождение be4.&lt;br /&gt;
&lt;br /&gt;
=== Запуск из-под Eclipse ===&lt;br /&gt;
Для компиляции необходимы&lt;br /&gt;
# '''Java 8''' [http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html отсюда],&lt;br /&gt;
# '''Eclipse IDE for Java EE Developers''', Eclipse '''Luna SR2''' [http://www.eclipse.org/downloads/packages/release/luna/sr2 отсюда],&lt;br /&gt;
# '''Наша версия Freemarker IDE''' - обычно мы импортируем проекты org.freemarker.core и org.jboss.ide.eclipse.freemarker из публичного репозитория https://github.com/amaembo/jbosstools-freemarker.git (см. ниже),&lt;br /&gt;
# '''IvyDE''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# '''YEdit''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# Наш проект '''common''' - его необходимо импортировать в workspace.&lt;br /&gt;
&lt;br /&gt;
Необходимо создать API baseline. Для этого заходим в Window -&amp;gt; Preferences, Plug-in Development -&amp;gt; API Baselines, там вводим любое Name, нажимаем Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
Необходимо создать конфигурацию запуска. Заходим в &amp;quot;Debug Configurations...&amp;quot; (можно нажать Ctrl+3 и начать печатать &amp;quot;Debug Configurations&amp;quot;), там кликаем два раза на Eclipse Application, открываем вкладку Plug-ins, выбираем &amp;quot;Launch with: all workspace and enabled target plug-ins&amp;quot;, нажимаем Apply, Debug (потом при запуске просто будем нажимать F11 вместо входа сюда). Помимо этого см. настройки запуска ниже.&lt;br /&gt;
&lt;br /&gt;
Для проверки того, что всё установлено и будет корректно работать, нужно зайти на вкладку Plug-ins конфигурации запуска и там нажать &amp;quot;Validate Plug-ins&amp;quot; чтобы убедиться, что все необходимые плагины имеются.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Варианты установки Freemarker IDE ===&lt;br /&gt;
==== Вариант 1 (запуск без исходного кода Freemarker IDE). ====&lt;br /&gt;
Установить содержимое \\files.dote.ru\pub2\_be4\Installation\freemarker.feature.zip&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки.&lt;br /&gt;
&lt;br /&gt;
==== Вариант 2 (для разработчиков Freemarker IDE). ====&lt;br /&gt;
# Необходим репозиторий https://github.com/amaembo/jbosstools-freemarker.git&lt;br /&gt;
# После скачивания репозитория нужно импортировать два проекта:&lt;br /&gt;
#*- org.freemarker.core&lt;br /&gt;
#*- org.jboss.ide.eclipse.freemarker. Остальные проекты можно не импортировать или просто закрыть.&lt;br /&gt;
# Windows -&amp;gt; Preferences; Plug-In Development -&amp;gt; API Baselines; ввести произвольное имя, Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
=== Настройки запуска: ===&lt;br /&gt;
# Run-&amp;gt;Debug Configurations..., выбрать Eclipse Application, нажать New launch configuration.&lt;br /&gt;
# Выбрать каталог в Workspace data (лучше создать новый пустой, например, c:\projects\be4-workspace).&lt;br /&gt;
# Execution environment -&amp;gt; Java 1.8.&lt;br /&gt;
# Вкладка Arguments Скопировать это значение в поле VM Arguments: '''-Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx768m -ea'''&lt;br /&gt;
# Apply, Debug.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4</id>
		<title>Компиляция и запуск BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4"/>
				<updated>2016-01-25T08:36:24Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Простой запуск ===&lt;br /&gt;
Простой запуск:&lt;br /&gt;
# убедиться, что установлена Java 8 (JRE достаточно);&lt;br /&gt;
# поместить исходники be4 в C:\projects\java\be4;&lt;br /&gt;
# взять Eclipse IDE for Java EE Developers, Eclipse Luna SR2 из этой папки: \\logrus.dote.ru\pub2\be4;&lt;br /&gt;
# отсюда же устанавливаем наши плагины, для этого заходим в Help -&amp;gt; Install New Software..., Add... копируем file:////logrus.dote.ru/pub2/be4/com.beanexplorer.be4.site/ в Location, OK, снимаем галочку Group items by category (если список фич пуст), ставим галочку на BeanExplorer4, Next и т.д.&lt;br /&gt;
&lt;br /&gt;
После перезагрузки Eclipse для работы с BE4 нужно будет выбрать перспективу BeanExplorer. При этом (или же при запуске Eclipse) Eclipse спросит, откуда взять исходники be4, если не догадается об их местоположении. В случае, если be4 находится в C:\projects\java\be4, то всё должно происходить само. Эти исходники нужны только для загрузки модулей.&lt;br /&gt;
&lt;br /&gt;
=== Запуск из-под Eclipse ===&lt;br /&gt;
Для компиляции необходимы&lt;br /&gt;
# '''Java 8''' [http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html отсюда],&lt;br /&gt;
# '''Eclipse IDE for Java EE Developers''', Eclipse '''Luna SR2''' [http://www.eclipse.org/downloads/packages/release/luna/sr2 отсюда],&lt;br /&gt;
# '''Наша версия Freemarker IDE''' - обычно мы импортируем проекты org.freemarker.core и org.jboss.ide.eclipse.freemarker из публичного репозитория https://github.com/amaembo/jbosstools-freemarker.git (см. ниже),&lt;br /&gt;
# '''IvyDE''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# '''YEdit''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# Наш проект '''common''' - его необходимо импортировать в workspace.&lt;br /&gt;
&lt;br /&gt;
Необходимо создать API baseline. Для этого заходим в Window -&amp;gt; Preferences, Plug-in Development -&amp;gt; API Baselines, там вводим любое Name, нажимаем Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
Необходимо создать конфигурацию запуска. Заходим в &amp;quot;Debug Configurations...&amp;quot; (можно нажать Ctrl+3 и начать печатать &amp;quot;Debug Configurations&amp;quot;), там кликаем два раза на Eclipse Application, открываем вкладку Plug-ins, выбираем &amp;quot;Launch with: all workspace and enabled target plug-ins&amp;quot;, нажимаем Apply, Debug (потом при запуске просто будем нажимать F11 вместо входа сюда). Помимо этого см. настройки запуска ниже.&lt;br /&gt;
&lt;br /&gt;
Для проверки того, что всё установлено и будет корректно работать, нужно зайти на вкладку Plug-ins конфигурации запуска и там нажать &amp;quot;Validate Plug-ins&amp;quot; чтобы убедиться, что все необходимые плагины имеются.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Варианты установки Freemarker IDE ===&lt;br /&gt;
==== Вариант 1 (запуск без исходного кода Freemarker IDE). ====&lt;br /&gt;
Установить содержимое \\files.dote.ru\pub2\_be4\Installation\freemarker.feature.zip&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки.&lt;br /&gt;
&lt;br /&gt;
==== Вариант 2 (для разработчиков Freemarker IDE). ====&lt;br /&gt;
# Необходим репозиторий https://github.com/amaembo/jbosstools-freemarker.git&lt;br /&gt;
# После скачивания репозитория нужно импортировать два проекта:&lt;br /&gt;
#*- org.freemarker.core&lt;br /&gt;
#*- org.jboss.ide.eclipse.freemarker. Остальные проекты можно не импортировать или просто закрыть.&lt;br /&gt;
# Windows -&amp;gt; Preferences; Plug-In Development -&amp;gt; API Baselines; ввести произвольное имя, Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
=== Настройки запуска: ===&lt;br /&gt;
# Run-&amp;gt;Debug Configurations..., выбрать Eclipse Application, нажать New launch configuration.&lt;br /&gt;
# Выбрать каталог в Workspace data (лучше создать новый пустой, например, c:\projects\be4-workspace).&lt;br /&gt;
# Execution environment -&amp;gt; Java 1.8.&lt;br /&gt;
# Вкладка Arguments Скопировать это значение в поле VM Arguments: '''-Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx768m -ea'''&lt;br /&gt;
# Apply, Debug.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4</id>
		<title>Компиляция и запуск BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4"/>
				<updated>2016-01-22T10:49:00Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Запуск из-под Eclipse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Простой запуск ===&lt;br /&gt;
Самый простой запуск:&lt;br /&gt;
# убедиться, что установлена Java 8 (JRE достаточно);&lt;br /&gt;
# установить из Eclipse MarketPlace плагин IvyDE.&lt;br /&gt;
# поместить исходники be4 в любую папку;&lt;br /&gt;
# сделать одно из следующих действий:&lt;br /&gt;
#* скачать готовый Eclipse для Windows x64 с files.dote.ru (обычно это архив eclipse.zip в папке Product-&amp;lt;ДАТА-ПУБЛИКАЦИИ&amp;gt; внутри \\files.dote.ru\pub2\_be4\Installation) и разархивировать в любую папку;&lt;br /&gt;
#* скачать Eclipse для своей ОС и установить на него содержимое архива repository.zip (обычно он находится в папке Product-&amp;lt;ДАТА-ПУБЛИКАЦИИ&amp;gt; внутри \\files.dote.ru\pub2\_be4\Installation).&lt;br /&gt;
&lt;br /&gt;
При запуске eclipse.exe спросит, откуда взять исходники be4, если не догадается об их местоположении.&lt;br /&gt;
&lt;br /&gt;
=== Запуск из-под Eclipse ===&lt;br /&gt;
Для компиляции необходимы&lt;br /&gt;
# '''Java 8''' [http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html отсюда],&lt;br /&gt;
# '''Eclipse IDE for Java EE Developers''', Eclipse '''Luna SR2''' [http://www.eclipse.org/downloads/packages/release/luna/sr2 отсюда],&lt;br /&gt;
# '''Наша версия Freemarker IDE''' - обычно мы импортируем проекты org.freemarker.core и org.jboss.ide.eclipse.freemarker из публичного репозитория https://github.com/amaembo/jbosstools-freemarker.git (см. ниже),&lt;br /&gt;
# '''IvyDE''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# '''YEdit''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# Наш проект '''common''' - его необходимо импортировать в workspace.&lt;br /&gt;
&lt;br /&gt;
Необходимо создать API baseline. Для этого заходим в Window -&amp;gt; Preferences, Plug-in Development -&amp;gt; API Baselines, там вводим любое Name, нажимаем Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
Необходимо создать конфигурацию запуска. Заходим в &amp;quot;Debug Configurations...&amp;quot; (можно нажать Ctrl+3 и начать печатать &amp;quot;Debug Configurations&amp;quot;), там кликаем два раза на Eclipse Application, открываем вкладку Plug-ins, выбираем &amp;quot;Launch with: all workspace and enabled target plug-ins&amp;quot;, нажимаем Apply, Debug (потом при запуске просто будем нажимать F11 вместо входа сюда). Помимо этого см. настройки запуска ниже.&lt;br /&gt;
&lt;br /&gt;
Для проверки того, что всё установлено и будет корректно работать, нужно зайти на вкладку Plug-ins конфигурации запуска и там нажать &amp;quot;Validate Plug-ins&amp;quot; чтобы убедиться, что все необходимые плагины имеются.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Варианты установки Freemarker IDE ===&lt;br /&gt;
==== Вариант 1 (запуск без исходного кода Freemarker IDE). ====&lt;br /&gt;
Установить содержимое \\files.dote.ru\pub2\_be4\Installation\freemarker.feature.zip&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки.&lt;br /&gt;
&lt;br /&gt;
==== Вариант 2 (для разработчиков Freemarker IDE). ====&lt;br /&gt;
# Необходим репозиторий https://github.com/amaembo/jbosstools-freemarker.git&lt;br /&gt;
# После скачивания репозитория нужно импортировать два проекта:&lt;br /&gt;
#*- org.freemarker.core&lt;br /&gt;
#*- org.jboss.ide.eclipse.freemarker. Остальные проекты можно не импортировать или просто закрыть.&lt;br /&gt;
# Windows -&amp;gt; Preferences; Plug-In Development -&amp;gt; API Baselines; ввести произвольное имя, Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
=== Настройки запуска: ===&lt;br /&gt;
# Run-&amp;gt;Debug Configurations..., выбрать Eclipse Application, нажать New launch configuration.&lt;br /&gt;
# Выбрать каталог в Workspace data (лучше создать новый пустой, например, c:\projects\be4-workspace).&lt;br /&gt;
# Execution environment -&amp;gt; Java 1.8.&lt;br /&gt;
# Вкладка Arguments Скопировать это значение в поле VM Arguments: '''-Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx768m -ea'''&lt;br /&gt;
# Apply, Debug.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4</id>
		<title>Компиляция и запуск BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4"/>
				<updated>2016-01-22T10:47:13Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Запуск из-под Eclipse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Простой запуск ===&lt;br /&gt;
Самый простой запуск:&lt;br /&gt;
# убедиться, что установлена Java 8 (JRE достаточно);&lt;br /&gt;
# установить из Eclipse MarketPlace плагин IvyDE.&lt;br /&gt;
# поместить исходники be4 в любую папку;&lt;br /&gt;
# сделать одно из следующих действий:&lt;br /&gt;
#* скачать готовый Eclipse для Windows x64 с files.dote.ru (обычно это архив eclipse.zip в папке Product-&amp;lt;ДАТА-ПУБЛИКАЦИИ&amp;gt; внутри \\files.dote.ru\pub2\_be4\Installation) и разархивировать в любую папку;&lt;br /&gt;
#* скачать Eclipse для своей ОС и установить на него содержимое архива repository.zip (обычно он находится в папке Product-&amp;lt;ДАТА-ПУБЛИКАЦИИ&amp;gt; внутри \\files.dote.ru\pub2\_be4\Installation).&lt;br /&gt;
&lt;br /&gt;
При запуске eclipse.exe спросит, откуда взять исходники be4, если не догадается об их местоположении.&lt;br /&gt;
&lt;br /&gt;
=== Запуск из-под Eclipse ===&lt;br /&gt;
Для компиляции необходимы&lt;br /&gt;
# '''Java 8''' [http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html отсюда],&lt;br /&gt;
# '''Eclipse IDE for Java EE Developers''', Eclipse '''Luna SR2''' [http://www.eclipse.org/downloads/packages/release/luna/sr2 отсюда],&lt;br /&gt;
# '''Наша версия Freemarker IDE''' - обычно мы импортируем проекты org.freemarker.core и org.jboss.ide.eclipse.freemarker из публичного репозитория https://github.com/amaembo/jbosstools-freemarker.git (см. ниже),&lt;br /&gt;
# '''IvyDE''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# '''YEdit''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# Наш проект '''common''' - его необходимо импортировать в workspace.&lt;br /&gt;
&lt;br /&gt;
Необходимо создать API baseline. Для этого заходим в Window -&amp;gt; Preferences, Plug-in Development -&amp;gt; API Baselines, там вводим любое Name, нажимаем Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
Необходимо создать конфигурацию запуска. Заходим в &amp;quot;Debug Configurations...&amp;quot; (можно нажать Ctrl+3 и начать печатать &amp;quot;Debug Configurations&amp;quot;), там кликаем два раза на Eclipse Application, открываем вкладку Plug-ins, выбираем &amp;quot;Launch with: all workspace and enabled target plug-ins&amp;quot;, нажимаем Apply, Debug (потом при запуске просто будем нажимать F11 вместо входа сюда).&lt;br /&gt;
&lt;br /&gt;
Для проверки того, что всё установлено и будет корректно работать, нужно зайти на вкладку Plug-ins конфигурации запуска и там нажать &amp;quot;Validate Plug-ins&amp;quot; чтобы убедиться, что все необходимые плагины имеются.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Варианты установки Freemarker IDE ===&lt;br /&gt;
==== Вариант 1 (запуск без исходного кода Freemarker IDE). ====&lt;br /&gt;
Установить содержимое \\files.dote.ru\pub2\_be4\Installation\freemarker.feature.zip&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки.&lt;br /&gt;
&lt;br /&gt;
==== Вариант 2 (для разработчиков Freemarker IDE). ====&lt;br /&gt;
# Необходим репозиторий https://github.com/amaembo/jbosstools-freemarker.git&lt;br /&gt;
# После скачивания репозитория нужно импортировать два проекта:&lt;br /&gt;
#*- org.freemarker.core&lt;br /&gt;
#*- org.jboss.ide.eclipse.freemarker. Остальные проекты можно не импортировать или просто закрыть.&lt;br /&gt;
# Windows -&amp;gt; Preferences; Plug-In Development -&amp;gt; API Baselines; ввести произвольное имя, Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
=== Настройки запуска: ===&lt;br /&gt;
# Run-&amp;gt;Debug Configurations..., выбрать Eclipse Application, нажать New launch configuration.&lt;br /&gt;
# Выбрать каталог в Workspace data (лучше создать новый пустой, например, c:\projects\be4-workspace).&lt;br /&gt;
# Execution environment -&amp;gt; Java 1.8.&lt;br /&gt;
# Вкладка Arguments Скопировать это значение в поле VM Arguments: '''-Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx768m -ea'''&lt;br /&gt;
# Apply, Debug.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4</id>
		<title>Компиляция и запуск BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4"/>
				<updated>2016-01-22T10:44:41Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Запуск из-под Eclipse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Простой запуск ===&lt;br /&gt;
Самый простой запуск:&lt;br /&gt;
# убедиться, что установлена Java 8 (JRE достаточно);&lt;br /&gt;
# установить из Eclipse MarketPlace плагин IvyDE.&lt;br /&gt;
# поместить исходники be4 в любую папку;&lt;br /&gt;
# сделать одно из следующих действий:&lt;br /&gt;
#* скачать готовый Eclipse для Windows x64 с files.dote.ru (обычно это архив eclipse.zip в папке Product-&amp;lt;ДАТА-ПУБЛИКАЦИИ&amp;gt; внутри \\files.dote.ru\pub2\_be4\Installation) и разархивировать в любую папку;&lt;br /&gt;
#* скачать Eclipse для своей ОС и установить на него содержимое архива repository.zip (обычно он находится в папке Product-&amp;lt;ДАТА-ПУБЛИКАЦИИ&amp;gt; внутри \\files.dote.ru\pub2\_be4\Installation).&lt;br /&gt;
&lt;br /&gt;
При запуске eclipse.exe спросит, откуда взять исходники be4, если не догадается об их местоположении.&lt;br /&gt;
&lt;br /&gt;
=== Запуск из-под Eclipse ===&lt;br /&gt;
Для компиляции необходимы&lt;br /&gt;
# '''Java 8''' [http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html отсюда],&lt;br /&gt;
# '''Eclipse IDE for Java EE Developers''', Eclipse '''Luna SR2''' [http://www.eclipse.org/downloads/packages/release/luna/sr2 отсюда],&lt;br /&gt;
# '''Наша версия Freemarker IDE''' - обычно мы импортируем проекты org.freemarker.core и org.jboss.ide.eclipse.freemarker,&lt;br /&gt;
# '''IvyDE''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# '''YEdit''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# Наш проект '''common''' - его необходимо импортировать в workspace.&lt;br /&gt;
&lt;br /&gt;
Необходимо создать API baseline. Для этого заходим в Window -&amp;gt; Preferences, Plug-in Development -&amp;gt; API Baselines, там вводим любое Name, нажимаем Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
Необходимо создать конфигурацию запуска. Заходим в &amp;quot;Debug Configurations...&amp;quot; (можно нажать Ctrl+3 и начать печатать &amp;quot;Debug Configurations&amp;quot;), там кликаем два раза на Eclipse Application, открываем вкладку Plug-ins, выбираем &amp;quot;Launch with: all workspace and enabled target plug-ins&amp;quot;, нажимаем Apply, Debug (потом при запуске просто будем нажимать F11 вместо входа сюда).&lt;br /&gt;
&lt;br /&gt;
Для проверки того, что всё установлено и будет корректно работать, нужно зайти на вкладку Plug-ins конфигурации запуска и там нажать &amp;quot;Validate Plug-ins&amp;quot; чтобы убедиться, что все необходимые плагины имеются.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Варианты установки Freemarker IDE ===&lt;br /&gt;
==== Вариант 1 (запуск без исходного кода Freemarker IDE). ====&lt;br /&gt;
Установить содержимое \\files.dote.ru\pub2\_be4\Installation\freemarker.feature.zip&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки.&lt;br /&gt;
&lt;br /&gt;
==== Вариант 2 (для разработчиков Freemarker IDE). ====&lt;br /&gt;
# Необходим репозиторий https://github.com/amaembo/jbosstools-freemarker.git&lt;br /&gt;
# После скачивания репозитория нужно импортировать два проекта:&lt;br /&gt;
#*- org.freemarker.core&lt;br /&gt;
#*- org.jboss.ide.eclipse.freemarker. Остальные проекты можно не импортировать или просто закрыть.&lt;br /&gt;
# Windows -&amp;gt; Preferences; Plug-In Development -&amp;gt; API Baselines; ввести произвольное имя, Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
=== Настройки запуска: ===&lt;br /&gt;
# Run-&amp;gt;Debug Configurations..., выбрать Eclipse Application, нажать New launch configuration.&lt;br /&gt;
# Выбрать каталог в Workspace data (лучше создать новый пустой, например, c:\projects\be4-workspace).&lt;br /&gt;
# Execution environment -&amp;gt; Java 1.8.&lt;br /&gt;
# Вкладка Arguments Скопировать это значение в поле VM Arguments: '''-Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx768m -ea'''&lt;br /&gt;
# Apply, Debug.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4</id>
		<title>Компиляция и запуск BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4"/>
				<updated>2016-01-22T10:34:50Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Запуск из-под Eclipse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Простой запуск ===&lt;br /&gt;
Самый простой запуск:&lt;br /&gt;
# убедиться, что установлена Java 8 (JRE достаточно);&lt;br /&gt;
# установить из Eclipse MarketPlace плагин IvyDE.&lt;br /&gt;
# поместить исходники be4 в любую папку;&lt;br /&gt;
# сделать одно из следующих действий:&lt;br /&gt;
#* скачать готовый Eclipse для Windows x64 с files.dote.ru (обычно это архив eclipse.zip в папке Product-&amp;lt;ДАТА-ПУБЛИКАЦИИ&amp;gt; внутри \\files.dote.ru\pub2\_be4\Installation) и разархивировать в любую папку;&lt;br /&gt;
#* скачать Eclipse для своей ОС и установить на него содержимое архива repository.zip (обычно он находится в папке Product-&amp;lt;ДАТА-ПУБЛИКАЦИИ&amp;gt; внутри \\files.dote.ru\pub2\_be4\Installation).&lt;br /&gt;
&lt;br /&gt;
При запуске eclipse.exe спросит, откуда взять исходники be4, если не догадается об их местоположении.&lt;br /&gt;
&lt;br /&gt;
=== Запуск из-под Eclipse ===&lt;br /&gt;
Для компиляции необходимы&lt;br /&gt;
# '''Java 8''' [http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html отсюда],&lt;br /&gt;
# '''Eclipse IDE for Java EE Developers''', Eclipse '''Luna SR2''' [http://www.eclipse.org/downloads/packages/release/luna/sr2 отсюда],&lt;br /&gt;
# '''Наша версия Freemarker IDE''' - обычно мы импортируем проекты org.freemarker.core и org.jboss.ide.eclipse.freemarker,&lt;br /&gt;
# '''IvyDE''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# '''YEdit''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# Наш проект '''common''' - его необходимо импортировать в workspace.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Варианты установки Freemarker IDE ===&lt;br /&gt;
==== Вариант 1 (запуск без исходного кода Freemarker IDE). ====&lt;br /&gt;
Установить содержимое \\files.dote.ru\pub2\_be4\Installation\freemarker.feature.zip&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки.&lt;br /&gt;
&lt;br /&gt;
==== Вариант 2 (для разработчиков Freemarker IDE). ====&lt;br /&gt;
# Необходим репозиторий https://github.com/amaembo/jbosstools-freemarker.git&lt;br /&gt;
# После скачивания репозитория нужно импортировать два проекта:&lt;br /&gt;
#*- org.freemarker.core&lt;br /&gt;
#*- org.jboss.ide.eclipse.freemarker. Остальные проекты можно не импортировать или просто закрыть.&lt;br /&gt;
# Windows -&amp;gt; Preferences; Plug-In Development -&amp;gt; API Baselines; ввести произвольное имя, Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
=== Настройки запуска: ===&lt;br /&gt;
# Run-&amp;gt;Debug Configurations..., выбрать Eclipse Application, нажать New launch configuration.&lt;br /&gt;
# Выбрать каталог в Workspace data (лучше создать новый пустой, например, c:\projects\be4-workspace).&lt;br /&gt;
# Execution environment -&amp;gt; Java 1.8.&lt;br /&gt;
# Вкладка Arguments Скопировать это значение в поле VM Arguments: '''-Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx768m -ea'''&lt;br /&gt;
# Apply, Debug.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4</id>
		<title>Компиляция и запуск BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4"/>
				<updated>2016-01-22T10:31:08Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Запуск из-под Eclipse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Простой запуск ===&lt;br /&gt;
Самый простой запуск:&lt;br /&gt;
# убедиться, что установлена Java 8 (JRE достаточно);&lt;br /&gt;
# установить из Eclipse MarketPlace плагин IvyDE.&lt;br /&gt;
# поместить исходники be4 в любую папку;&lt;br /&gt;
# сделать одно из следующих действий:&lt;br /&gt;
#* скачать готовый Eclipse для Windows x64 с files.dote.ru (обычно это архив eclipse.zip в папке Product-&amp;lt;ДАТА-ПУБЛИКАЦИИ&amp;gt; внутри \\files.dote.ru\pub2\_be4\Installation) и разархивировать в любую папку;&lt;br /&gt;
#* скачать Eclipse для своей ОС и установить на него содержимое архива repository.zip (обычно он находится в папке Product-&amp;lt;ДАТА-ПУБЛИКАЦИИ&amp;gt; внутри \\files.dote.ru\pub2\_be4\Installation).&lt;br /&gt;
&lt;br /&gt;
При запуске eclipse.exe спросит, откуда взять исходники be4, если не догадается об их местоположении.&lt;br /&gt;
&lt;br /&gt;
=== Запуск из-под Eclipse ===&lt;br /&gt;
Для компиляции необходимы&lt;br /&gt;
# '''Java 8''' [http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html отсюда],&lt;br /&gt;
# '''Eclipse IDE for Java EE Developers''', Eclipse '''Luna SR2''' [http://www.eclipse.org/downloads/packages/release/luna/sr2 отсюда],&lt;br /&gt;
# '''Наша версия Freemarker IDE''',&lt;br /&gt;
# '''IvyDE''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# Наш проект '''common'''.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Варианты установки Freemarker IDE ===&lt;br /&gt;
==== Вариант 1 (запуск без исходного кода Freemarker IDE). ====&lt;br /&gt;
Установить содержимое \\files.dote.ru\pub2\_be4\Installation\freemarker.feature.zip&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки.&lt;br /&gt;
&lt;br /&gt;
==== Вариант 2 (для разработчиков Freemarker IDE). ====&lt;br /&gt;
# Необходим репозиторий https://github.com/amaembo/jbosstools-freemarker.git&lt;br /&gt;
# После скачивания репозитория нужно импортировать два проекта:&lt;br /&gt;
#*- org.freemarker.core&lt;br /&gt;
#*- org.jboss.ide.eclipse.freemarker. Остальные проекты можно не импортировать или просто закрыть.&lt;br /&gt;
# Windows -&amp;gt; Preferences; Plug-In Development -&amp;gt; API Baselines; ввести произвольное имя, Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
=== Настройки запуска: ===&lt;br /&gt;
# Run-&amp;gt;Debug Configurations..., выбрать Eclipse Application, нажать New launch configuration.&lt;br /&gt;
# Выбрать каталог в Workspace data (лучше создать новый пустой, например, c:\projects\be4-workspace).&lt;br /&gt;
# Execution environment -&amp;gt; Java 1.8.&lt;br /&gt;
# Вкладка Arguments Скопировать это значение в поле VM Arguments: '''-Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx768m -ea'''&lt;br /&gt;
# Apply, Debug.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5_API</id>
		<title>BeanExplorer5 API</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5_API"/>
				<updated>2015-11-25T09:49:02Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Основные интерфейсы и классы API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Backend ==&lt;br /&gt;
&amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При сборке BeanExplorer5 проекта он воспринимается как OSGi бандл, поэтому у него должен быть манифест &amp;lt;code&amp;gt;META-INF/MANIFEST.MF&amp;lt;/code&amp;gt;. В этом манифесте указывается, от каких бандлов зависит данный бандл. Основные классы API находятся в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;, поэтому его необходимо указать в манифесте.&lt;br /&gt;
&lt;br /&gt;
Помимо этого в структуру BeanExplorer5 проекта входит &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;, в котором возможно объявлять свои компоненты, используя точку расширения &amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt;, которая объявлена в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;. Пример объявления компонента:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;extension point=&amp;quot;com.beanexplorer.be5.component&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;component&lt;br /&gt;
     class=&amp;quot;com.beanexplorer.enterprise.components.Menu&amp;quot;&lt;br /&gt;
     id=&amp;quot;menu&amp;quot;&lt;br /&gt;
     name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указанный класс должен реализовывать интерфейс &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 package com.beanexplorer.enterprise.components;&lt;br /&gt;
 &lt;br /&gt;
 public interface Component {&lt;br /&gt;
   void generate(ComponentParameters parameters);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt; - это единственная точка расширения BeanExplorer5, она позволяет регистрировать свои backend компоненты, которые будут доступны по следующим URL:&lt;br /&gt;
&lt;br /&gt;
 //domain/app/main/:componentId&lt;br /&gt;
 //domain/app/main/:componentId/:any/:path&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu/withIds&lt;br /&gt;
&lt;br /&gt;
При запросе к веб-приложению по этим запросам будет создан новый экземпляр компонента и вызван его метод generate. Для того, чтобы узнать путь после имени компонента (&amp;lt;code&amp;gt;:any/:path&amp;lt;/code&amp;gt;), нужно вызвать метод &amp;lt;code&amp;gt;parameters.getRequestUri()&amp;lt;/code&amp;gt;. В случае пустого пути возвращается пустая строка. В случае наличия пути, он возвращается без начального слеша.&lt;br /&gt;
&lt;br /&gt;
=== Основные интерфейсы и классы API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt; - главный интерфейс, который должны реализовывать BE5 компоненты. Поскольку проще всего общаться с frontend посредством пересылки JSON, существуют абстрактные классы, которые упрощают написание таких компонентов:&lt;br /&gt;
** &amp;lt;code&amp;gt;JsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий строку, представляющую собой JSON.&lt;br /&gt;
** &amp;lt;code&amp;gt;NetSfJsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий &amp;lt;code&amp;gt;net.sf.json.JSONObject&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComponentParameters&amp;lt;/code&amp;gt; - всё, что необходимо компоненту. Если необходимо что-то ещё, то либо мы что-то забыли или не предусмотрели (и об этом непременно стоит сообщить нам), либо вы неправильно используете API BeanExplorer5. К чему возможно доступиться из этого компонента:&lt;br /&gt;
** &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; - BE4 проект.&lt;br /&gt;
** &amp;lt;code&amp;gt;Meta&amp;lt;/code&amp;gt; - полезные методы для работы с BE4 проектом.&lt;br /&gt;
** &amp;lt;code&amp;gt;UserService&amp;lt;/code&amp;gt; - работа с сессиями, ролями, выбором языка.&lt;br /&gt;
** &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt; - формирование текстового ответа. Необходимо только для абстрактных компонентов, обеспечивающих обмен текстовыми сообщениями в каком-нибудь формате (JSON, XML и т.п.).&lt;br /&gt;
** &amp;lt;code&amp;gt;HttpServletRequest&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;HttpServletResponse&amp;lt;/code&amp;gt; - предполагается, что в обычной ситуации они не используются. Необходимы только для реализации абстрактных компонентов, обеспечивающих работу с каким-нибудь протоколом на низком уровне. Для обмена текстом достаточно &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Обратите внимание на то, что другие классы не являются частью API, в т.ч. класс Be5 и классы, связанные с реализацией конкретных компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Частью API также '''не''' являются соглашения о том, какие данные возвращают компоненты, поскольку эти соглашения используются обмена сообщениями между frontend и backend частями компонентов. Исключением являются соглашения о том, какие данные возвращают компоненты, описанные в разделе [[#REST API|REST API]].&lt;br /&gt;
&lt;br /&gt;
== Frontend ==&lt;br /&gt;
&amp;lt;big&amp;gt;Компоненты BE5 на frontend - это React.js компоненты.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты подключаются через SystemJS, при этом используется синтаксис ES2015 или метод &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 import Component from 'components/component';&lt;br /&gt;
&lt;br /&gt;
 define([ 'components/component' ], function(Component) {&lt;br /&gt;
   // use(Component)&lt;br /&gt;
   // ...&lt;br /&gt;
   return {};&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Кнопки и ссылки на компоненты (в частности запросы и формы) в BE5 не должны писаться вручную. &lt;br /&gt;
&lt;br /&gt;
Не всё, что находится в проекте be5-frontend, является частью API.&lt;br /&gt;
&lt;br /&gt;
=== Основные части API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; - ядро frontend. Функции, являющиеся частью API:&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.net.request: function(path, params, success, failure)&amp;lt;/code&amp;gt; - делает асинхронный POST запрос к ''вашему'' backend компоненту (&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;componentId/any/path&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.registerAction: function(actionName, fn)&amp;lt;/code&amp;gt; - регистрирует действие, которое будет вызвано при клике по кнопке или ссылке. Вызов действия является следствием смены hash url, при этом адрес разбирается на позиционные и именованные параметры. В зарегистрированную функцию передаются все позиционные параметры, за которыми идёт объект с именованными параметрами. Именованными параметрами считаются части URL, которые содержат символ '=', а позиционными считаются все остальные.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.registerDocumentType: function(type, creator)&amp;lt;/code&amp;gt; - регистрирует новый вид документа. Функция, переданная вторым параметром в &amp;lt;code&amp;gt;registerDocumentType&amp;lt;/code&amp;gt; обычно вызывает &amp;lt;code&amp;gt;React.createElement&amp;lt;/code&amp;gt; и возвращает результат вызова. Результат будет помещён в стандартное для проекта место отображения документа. На данный момент на backend невозможно добавлять свои виды документов, но документ возможно создать посредством вызова &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt; - пересоздаёт документ. В качестве аргумента передаётся объект с двумя полями: &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. Первое указывает тип документа, второе - значение документа, которое интерпретируется обработчиком документа, зарегистрированным посредством вызова &amp;lt;code&amp;gt;be5.ui.registerDocumentType&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.createDocument&amp;lt;/code&amp;gt; - похож на &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;, однако позволяет встраивать документы в произвольное место страницы. Полезно, если тип документа заранее неизвестен.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.load.css(path)&amp;lt;/code&amp;gt; - подгружает CSS динамически, это необходимо во frontend компонентах, которым нужен CSS. &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - путь к файлу CSS, например &amp;lt;code&amp;gt;css/menu.css&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.messages&amp;lt;/code&amp;gt; - объект с локализованными сообщениями (русский и английский язык).&lt;br /&gt;
&lt;br /&gt;
==== Другой способ определения действий ====&lt;br /&gt;
Вы также можете определить действие неявным способом не вызывая &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;. Для этого создаётся файл с именем &amp;lt;code&amp;gt;/actions/yourAction.js&amp;lt;/code&amp;gt;, который определяет AMD модуль посредством метода &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;. Объявдяемым элементом в этом модуле является функция, которая используется так же, как и функция, регистрируемая вызовом &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;, однако при этом подгрузка компонента произойдёт лениво - при первом его использовании.&lt;br /&gt;
&lt;br /&gt;
=== Компоненты ===&lt;br /&gt;
&amp;lt;big&amp;gt;API React компонентов описывается в соответствующих файлах в &amp;lt;code&amp;gt;propTypes&amp;lt;/code&amp;gt; React компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты, не указанные ниже, не являются частью API. По соглашениям именования мы сопоставляем имя компонента &amp;lt;code&amp;gt;ComponentName&amp;lt;/code&amp;gt; SystemJS модулю &amp;lt;code&amp;gt;component/componentName&amp;lt;/code&amp;gt;, который находится в файле &amp;lt;code&amp;gt;component/componentName.js&amp;lt;/code&amp;gt; (или &amp;lt;code&amp;gt;component/componentName.jsx&amp;lt;/code&amp;gt;, если для вашего проекта настроена компиляция JSX).&lt;br /&gt;
&lt;br /&gt;
==== Be5Block ====&lt;br /&gt;
Простая таблица внутри Bootstrap 4 Card.&lt;br /&gt;
&lt;br /&gt;
==== Be5Form ====&lt;br /&gt;
Простая форма внутри Bootstrap 4 Card.&lt;br /&gt;
&lt;br /&gt;
==== Be5View ====&lt;br /&gt;
Обобщённый компонент для таблиц, форм и статических страниц.&lt;br /&gt;
&lt;br /&gt;
==== SimpleTable ====&lt;br /&gt;
Простая таблица.&lt;br /&gt;
&lt;br /&gt;
==== SimpleForm ====&lt;br /&gt;
Простая форма.&lt;br /&gt;
&lt;br /&gt;
==== Document ====&lt;br /&gt;
Место для любого документа, в т.ч. формы или таблицы.&lt;br /&gt;
&lt;br /&gt;
== REST API ==&lt;br /&gt;
Запросы отсылаются с телом &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== document ===&lt;br /&gt;
Пример запроса (здесь указано содержимое тела запроса - на самом деле оно выглядит несколько иначе, поскольку кодируется в &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 category: servers&lt;br /&gt;
 page: All records&lt;br /&gt;
 values:&lt;br /&gt;
&lt;br /&gt;
Пример таблицы:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;table&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Servers: All records&amp;quot;,&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;servers&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;operations&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;visibleWhen&amp;quot;: &amp;quot;anySelected&amp;quot;,&lt;br /&gt;
       &amp;quot;requiresConfirmation&amp;quot;: false,&lt;br /&gt;
       &amp;quot;isClientSide&amp;quot;: false&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;selectable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;columns&amp;quot;: [ &amp;quot;Edit&amp;quot;, &amp;quot;Provider&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;Name&amp;quot;, &amp;quot;Address&amp;quot;, &amp;quot;Description&amp;quot;, &amp;quot;Products&amp;quot;, &amp;quot;Remote address&amp;quot; ],&lt;br /&gt;
     &amp;quot;rows&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;length&amp;quot;: 20,&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;totalNumberOfRows&amp;quot;: 20&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== document/count ===&lt;br /&gt;
Запрос выглядит так же, как и у &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 { &amp;quot;value&amp;quot;: 3 }&lt;br /&gt;
&lt;br /&gt;
=== form ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 values:&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;form&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;groups&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;selectedRows&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;fields&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;language&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Language&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;comboBox&amp;quot;,&lt;br /&gt;
       &amp;quot;options&amp;quot;: [ {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Afar&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
       }, ..., {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Zulu&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;zu&amp;quot;&lt;br /&gt;
       } ],&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;en&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;description&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Description&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textArea&amp;quot;,&lt;br /&gt;
       &amp;quot;columns&amp;quot;: 40,&lt;br /&gt;
       &amp;quot;rows&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;maxUsers&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Max Users&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: true,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;isViewParameters&amp;quot;: false&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== form/apply ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 values: [{&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;language&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;en&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;description&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;maxUsers&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;required&amp;quot;:false}]&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   type: &amp;quot;formResult&amp;quot;,&lt;br /&gt;
   value: {&lt;br /&gt;
     content: &amp;quot;&amp;quot;,&lt;br /&gt;
     redirect: &amp;quot;table/groups/All records&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5_API</id>
		<title>BeanExplorer5 API</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5_API"/>
				<updated>2015-11-25T09:20:22Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Backend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Backend ==&lt;br /&gt;
&amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При сборке BeanExplorer5 проекта он воспринимается как OSGi бандл, поэтому у него должен быть манифест &amp;lt;code&amp;gt;META-INF/MANIFEST.MF&amp;lt;/code&amp;gt;. В этом манифесте указывается, от каких бандлов зависит данный бандл. Основные классы API находятся в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;, поэтому его необходимо указать в манифесте.&lt;br /&gt;
&lt;br /&gt;
Помимо этого в структуру BeanExplorer5 проекта входит &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;, в котором возможно объявлять свои компоненты, используя точку расширения &amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt;, которая объявлена в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;. Пример объявления компонента:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;extension point=&amp;quot;com.beanexplorer.be5.component&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;component&lt;br /&gt;
     class=&amp;quot;com.beanexplorer.enterprise.components.Menu&amp;quot;&lt;br /&gt;
     id=&amp;quot;menu&amp;quot;&lt;br /&gt;
     name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указанный класс должен реализовывать интерфейс &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 package com.beanexplorer.enterprise.components;&lt;br /&gt;
 &lt;br /&gt;
 public interface Component {&lt;br /&gt;
   void generate(ComponentParameters parameters);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt; - это единственная точка расширения BeanExplorer5, она позволяет регистрировать свои backend компоненты, которые будут доступны по следующим URL:&lt;br /&gt;
&lt;br /&gt;
 //domain/app/main/:componentId&lt;br /&gt;
 //domain/app/main/:componentId/:any/:path&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu/withIds&lt;br /&gt;
&lt;br /&gt;
При запросе к веб-приложению по этим запросам будет создан новый экземпляр компонента и вызван его метод generate. Для того, чтобы узнать путь после имени компонента (&amp;lt;code&amp;gt;:any/:path&amp;lt;/code&amp;gt;), нужно вызвать метод &amp;lt;code&amp;gt;parameters.getRequestUri()&amp;lt;/code&amp;gt;. В случае пустого пути возвращается пустая строка. В случае наличия пути, он возвращается без начального слеша.&lt;br /&gt;
&lt;br /&gt;
=== Основные интерфейсы и классы API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt; - главный интерфейс, который должны реализовывать BE5 компоненты. Поскольку проще всего общаться с frontend посредством пересылки JSON, существуют абстрактные классы, которые упрощают написание таких компонентов:&lt;br /&gt;
** &amp;lt;code&amp;gt;JsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий строку, представляющую собой JSON.&lt;br /&gt;
** &amp;lt;code&amp;gt;NetSfJsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий &amp;lt;code&amp;gt;net.sf.json.JSONObject&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComponentParameters&amp;lt;/code&amp;gt; - всё, что необходимо компоненту. Если необходимо что-то ещё, то либо мы что-то забыли или не предусмотрели (и об этом непременно стоит сообщить нам), либо вы неправильно используете API BeanExplorer5. К чему возможно доступиться из этого компонента:&lt;br /&gt;
** &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; - BE4 проект.&lt;br /&gt;
** &amp;lt;code&amp;gt;Meta&amp;lt;/code&amp;gt; - полезные методы для работы с BE4 проектом.&lt;br /&gt;
** &amp;lt;code&amp;gt;UserService&amp;lt;/code&amp;gt; - работа с сессиями, ролями, выбором языка.&lt;br /&gt;
** &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt; - формирование текстового ответа. Необходимо только для абстрактных компонентов, обеспечивающих обмен текстовыми сообщениями в каком-нибудь формате (JSON, XML и т.п.).&lt;br /&gt;
** &amp;lt;code&amp;gt;HttpServletRequest&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;HttpServletResponse&amp;lt;/code&amp;gt; - предполагается, что в обычной ситуации они не используются. Необходимы только для реализации абстрактных компонентов, обеспечивающих работу с каким-нибудь протоколом на низком уровне. Для обмена текстом достаточно &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Обратите внимание на то, что другие классы не являются частью API, в т.ч. класс Be5 и классы, связанные с реализацией конкретных компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Частью API также являются соглашения о том, какие данные возвращают компоненты, поскольку эти соглашения используются обмена сообщениями между frontend и backend частями компонентов. Исключением являются соглашения о том, какие данные возвращают компоненты, описанные в разделе [[#REST API|REST API]].&lt;br /&gt;
&lt;br /&gt;
== Frontend ==&lt;br /&gt;
&amp;lt;big&amp;gt;Компоненты BE5 на frontend - это React.js компоненты.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты подключаются через SystemJS, при этом используется синтаксис ES2015 или метод &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 import Component from 'components/component';&lt;br /&gt;
&lt;br /&gt;
 define([ 'components/component' ], function(Component) {&lt;br /&gt;
   // use(Component)&lt;br /&gt;
   // ...&lt;br /&gt;
   return {};&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Кнопки и ссылки на компоненты (в частности запросы и формы) в BE5 не должны писаться вручную. &lt;br /&gt;
&lt;br /&gt;
Не всё, что находится в проекте be5-frontend, является частью API.&lt;br /&gt;
&lt;br /&gt;
=== Основные части API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; - ядро frontend. Функции, являющиеся частью API:&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.net.request: function(path, params, success, failure)&amp;lt;/code&amp;gt; - делает асинхронный POST запрос к ''вашему'' backend компоненту (&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;componentId/any/path&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.registerAction: function(actionName, fn)&amp;lt;/code&amp;gt; - регистрирует действие, которое будет вызвано при клике по кнопке или ссылке. Вызов действия является следствием смены hash url, при этом адрес разбирается на позиционные и именованные параметры. В зарегистрированную функцию передаются все позиционные параметры, за которыми идёт объект с именованными параметрами. Именованными параметрами считаются части URL, которые содержат символ '=', а позиционными считаются все остальные.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.registerDocumentType: function(type, creator)&amp;lt;/code&amp;gt; - регистрирует новый вид документа. Функция, переданная вторым параметром в &amp;lt;code&amp;gt;registerDocumentType&amp;lt;/code&amp;gt; обычно вызывает &amp;lt;code&amp;gt;React.createElement&amp;lt;/code&amp;gt; и возвращает результат вызова. Результат будет помещён в стандартное для проекта место отображения документа. На данный момент на backend невозможно добавлять свои виды документов, но документ возможно создать посредством вызова &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt; - пересоздаёт документ. В качестве аргумента передаётся объект с двумя полями: &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. Первое указывает тип документа, второе - значение документа, которое интерпретируется обработчиком документа, зарегистрированным посредством вызова &amp;lt;code&amp;gt;be5.ui.registerDocumentType&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.createDocument&amp;lt;/code&amp;gt; - похож на &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;, однако позволяет встраивать документы в произвольное место страницы. Полезно, если тип документа заранее неизвестен.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.load.css(path)&amp;lt;/code&amp;gt; - подгружает CSS динамически, это необходимо во frontend компонентах, которым нужен CSS. &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - путь к файлу CSS, например &amp;lt;code&amp;gt;css/menu.css&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.messages&amp;lt;/code&amp;gt; - объект с локализованными сообщениями (русский и английский язык).&lt;br /&gt;
&lt;br /&gt;
==== Другой способ определения действий ====&lt;br /&gt;
Вы также можете определить действие неявным способом не вызывая &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;. Для этого создаётся файл с именем &amp;lt;code&amp;gt;/actions/yourAction.js&amp;lt;/code&amp;gt;, который определяет AMD модуль посредством метода &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;. Объявдяемым элементом в этом модуле является функция, которая используется так же, как и функция, регистрируемая вызовом &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;, однако при этом подгрузка компонента произойдёт лениво - при первом его использовании.&lt;br /&gt;
&lt;br /&gt;
=== Компоненты ===&lt;br /&gt;
&amp;lt;big&amp;gt;API React компонентов описывается в соответствующих файлах в &amp;lt;code&amp;gt;propTypes&amp;lt;/code&amp;gt; React компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты, не указанные ниже, не являются частью API. По соглашениям именования мы сопоставляем имя компонента &amp;lt;code&amp;gt;ComponentName&amp;lt;/code&amp;gt; SystemJS модулю &amp;lt;code&amp;gt;component/componentName&amp;lt;/code&amp;gt;, который находится в файле &amp;lt;code&amp;gt;component/componentName.js&amp;lt;/code&amp;gt; (или &amp;lt;code&amp;gt;component/componentName.jsx&amp;lt;/code&amp;gt;, если для вашего проекта настроена компиляция JSX).&lt;br /&gt;
&lt;br /&gt;
==== Be5Block ====&lt;br /&gt;
Простая таблица внутри Bootstrap 4 Card.&lt;br /&gt;
&lt;br /&gt;
==== Be5Form ====&lt;br /&gt;
Простая форма внутри Bootstrap 4 Card.&lt;br /&gt;
&lt;br /&gt;
==== Be5View ====&lt;br /&gt;
Обобщённый компонент для таблиц, форм и статических страниц.&lt;br /&gt;
&lt;br /&gt;
==== SimpleTable ====&lt;br /&gt;
Простая таблица.&lt;br /&gt;
&lt;br /&gt;
==== SimpleForm ====&lt;br /&gt;
Простая форма.&lt;br /&gt;
&lt;br /&gt;
==== Document ====&lt;br /&gt;
Место для любого документа, в т.ч. формы или таблицы.&lt;br /&gt;
&lt;br /&gt;
== REST API ==&lt;br /&gt;
Запросы отсылаются с телом &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== document ===&lt;br /&gt;
Пример запроса (здесь указано содержимое тела запроса - на самом деле оно выглядит несколько иначе, поскольку кодируется в &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 category: servers&lt;br /&gt;
 page: All records&lt;br /&gt;
 values:&lt;br /&gt;
&lt;br /&gt;
Пример таблицы:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;table&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Servers: All records&amp;quot;,&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;servers&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;operations&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;visibleWhen&amp;quot;: &amp;quot;anySelected&amp;quot;,&lt;br /&gt;
       &amp;quot;requiresConfirmation&amp;quot;: false,&lt;br /&gt;
       &amp;quot;isClientSide&amp;quot;: false&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;selectable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;columns&amp;quot;: [ &amp;quot;Edit&amp;quot;, &amp;quot;Provider&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;Name&amp;quot;, &amp;quot;Address&amp;quot;, &amp;quot;Description&amp;quot;, &amp;quot;Products&amp;quot;, &amp;quot;Remote address&amp;quot; ],&lt;br /&gt;
     &amp;quot;rows&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;length&amp;quot;: 20,&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;totalNumberOfRows&amp;quot;: 20&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== document/count ===&lt;br /&gt;
Запрос выглядит так же, как и у &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 { &amp;quot;value&amp;quot;: 3 }&lt;br /&gt;
&lt;br /&gt;
=== form ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 values:&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;form&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;groups&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;selectedRows&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;fields&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;language&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Language&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;comboBox&amp;quot;,&lt;br /&gt;
       &amp;quot;options&amp;quot;: [ {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Afar&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
       }, ..., {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Zulu&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;zu&amp;quot;&lt;br /&gt;
       } ],&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;en&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;description&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Description&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textArea&amp;quot;,&lt;br /&gt;
       &amp;quot;columns&amp;quot;: 40,&lt;br /&gt;
       &amp;quot;rows&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;maxUsers&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Max Users&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: true,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;isViewParameters&amp;quot;: false&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== form/apply ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 values: [{&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;language&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;en&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;description&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;maxUsers&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;required&amp;quot;:false}]&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   type: &amp;quot;formResult&amp;quot;,&lt;br /&gt;
   value: {&lt;br /&gt;
     content: &amp;quot;&amp;quot;,&lt;br /&gt;
     redirect: &amp;quot;table/groups/All records&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5_API</id>
		<title>BeanExplorer5 API</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5_API"/>
				<updated>2015-11-25T09:14:32Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Компоненты */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Backend ==&lt;br /&gt;
&amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При сборке BeanExplorer5 проекта он воспринимается как OSGi бандл, поэтому у него должен быть манифест &amp;lt;code&amp;gt;META-INF/MANIFEST.MF&amp;lt;/code&amp;gt;. В этом манифесте указывается, от каких бандлов зависит данный бандл. Основные классы API находятся в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;, поэтому его необходимо указать в манифесте.&lt;br /&gt;
&lt;br /&gt;
Помимо этого в структуру BeanExplorer5 проекта входит &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;, в котором возможно объявлять свои компоненты, используя точку расширения &amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt;, которая объявлена в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;. Пример объявления компонента:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;extension point=&amp;quot;com.beanexplorer.be5.component&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;component&lt;br /&gt;
     class=&amp;quot;com.beanexplorer.enterprise.components.Menu&amp;quot;&lt;br /&gt;
     id=&amp;quot;menu&amp;quot;&lt;br /&gt;
     name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указанный класс должен реализовывать интерфейс &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 package com.beanexplorer.enterprise.components;&lt;br /&gt;
 &lt;br /&gt;
 public interface Component {&lt;br /&gt;
   void generate(ComponentParameters parameters);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt; - это единственная точка расширения BeanExplorer5, она позволяет регистрировать свои backend компоненты, которые будут доступны следующим URL:&lt;br /&gt;
&lt;br /&gt;
 //domain/app/main/:componentId&lt;br /&gt;
 //domain/app/main/:componentId/:any/:path&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu/withIds&lt;br /&gt;
&lt;br /&gt;
При запросе к веб-приложению по этим запросам будет создан новый экземпляр компонента и вызван его метод generate. Для того, чтобы узнать путь после имени компонента (&amp;lt;code&amp;gt;:any/:path&amp;lt;/code&amp;gt;), нужно вызвать метод &amp;lt;code&amp;gt;parameters.getRequestUri()&amp;lt;/code&amp;gt;. В случае пустого пути возвращается пустая строка. В случае наличия пути, он возвращается без начального слеша.&lt;br /&gt;
&lt;br /&gt;
=== Основные интерфейсы и классы API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt; - главный интерфейс, который должны реализовывать BE5 компоненты. Поскольку проще всего общаться с frontend посредством пересылки JSON, существуют абстрактные классы, которые упрощают написание таких компонентов:&lt;br /&gt;
** &amp;lt;code&amp;gt;JsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий строку, представляющую собой JSON.&lt;br /&gt;
** &amp;lt;code&amp;gt;NetSfJsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий &amp;lt;code&amp;gt;net.sf.json.JSONObject&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComponentParameters&amp;lt;/code&amp;gt; - всё, что необходимо компоненту. Если необходимо что-то ещё, то либо мы что-то забыли или не предусмотрели (и об этом непременно стоит сообщить нам), либо вы неправильно используете API BeanExplorer5. К чему возможно доступиться из этого компонента:&lt;br /&gt;
** &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; - BE4 проект.&lt;br /&gt;
** &amp;lt;code&amp;gt;Meta&amp;lt;/code&amp;gt; - полезные методы для работы с BE4 проектом.&lt;br /&gt;
** &amp;lt;code&amp;gt;UserService&amp;lt;/code&amp;gt; - работа с сессиями, ролями, выбором языка.&lt;br /&gt;
** &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt; - формирование текстового ответа. Необходимо только для абстрактных компонентов, обеспечивающих обмен текстовыми сообщениями в каком-нибудь формате (JSON, XML и т.п.).&lt;br /&gt;
** &amp;lt;code&amp;gt;HttpServletRequest&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;HttpServletResponse&amp;lt;/code&amp;gt; - предполагается, что в обычной ситуации они не используются. Необходимы только для реализации абстрактных компонентов, обеспечивающих работу с каким-нибудь протоколом на низком уровне. Для обмена текстом достаточно &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Обратите внимание на то, что другие классы не являются частью API, в т.ч. класс Be5 и классы, связанные с реализацией конкретных компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Частью API также являются соглашения о том, какие данные возвращают компоненты, поскольку эти соглашения используются обмена сообщениями между frontend и backend частями компонентов. Исключением являются соглашения о том, какие данные возвращают компоненты, описанные в разделе [[#REST API|REST API]].&lt;br /&gt;
&lt;br /&gt;
== Frontend ==&lt;br /&gt;
&amp;lt;big&amp;gt;Компоненты BE5 на frontend - это React.js компоненты.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты подключаются через SystemJS, при этом используется синтаксис ES2015 или метод &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 import Component from 'components/component';&lt;br /&gt;
&lt;br /&gt;
 define([ 'components/component' ], function(Component) {&lt;br /&gt;
   // use(Component)&lt;br /&gt;
   // ...&lt;br /&gt;
   return {};&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Кнопки и ссылки на компоненты (в частности запросы и формы) в BE5 не должны писаться вручную. &lt;br /&gt;
&lt;br /&gt;
Не всё, что находится в проекте be5-frontend, является частью API.&lt;br /&gt;
&lt;br /&gt;
=== Основные части API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; - ядро frontend. Функции, являющиеся частью API:&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.net.request: function(path, params, success, failure)&amp;lt;/code&amp;gt; - делает асинхронный POST запрос к ''вашему'' backend компоненту (&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;componentId/any/path&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.registerAction: function(actionName, fn)&amp;lt;/code&amp;gt; - регистрирует действие, которое будет вызвано при клике по кнопке или ссылке. Вызов действия является следствием смены hash url, при этом адрес разбирается на позиционные и именованные параметры. В зарегистрированную функцию передаются все позиционные параметры, за которыми идёт объект с именованными параметрами. Именованными параметрами считаются части URL, которые содержат символ '=', а позиционными считаются все остальные.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.registerDocumentType: function(type, creator)&amp;lt;/code&amp;gt; - регистрирует новый вид документа. Функция, переданная вторым параметром в &amp;lt;code&amp;gt;registerDocumentType&amp;lt;/code&amp;gt; обычно вызывает &amp;lt;code&amp;gt;React.createElement&amp;lt;/code&amp;gt; и возвращает результат вызова. Результат будет помещён в стандартное для проекта место отображения документа. На данный момент на backend невозможно добавлять свои виды документов, но документ возможно создать посредством вызова &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt; - пересоздаёт документ. В качестве аргумента передаётся объект с двумя полями: &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. Первое указывает тип документа, второе - значение документа, которое интерпретируется обработчиком документа, зарегистрированным посредством вызова &amp;lt;code&amp;gt;be5.ui.registerDocumentType&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.createDocument&amp;lt;/code&amp;gt; - похож на &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;, однако позволяет встраивать документы в произвольное место страницы. Полезно, если тип документа заранее неизвестен.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.load.css(path)&amp;lt;/code&amp;gt; - подгружает CSS динамически, это необходимо во frontend компонентах, которым нужен CSS. &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - путь к файлу CSS, например &amp;lt;code&amp;gt;css/menu.css&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.messages&amp;lt;/code&amp;gt; - объект с локализованными сообщениями (русский и английский язык).&lt;br /&gt;
&lt;br /&gt;
==== Другой способ определения действий ====&lt;br /&gt;
Вы также можете определить действие неявным способом не вызывая &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;. Для этого создаётся файл с именем &amp;lt;code&amp;gt;/actions/yourAction.js&amp;lt;/code&amp;gt;, который определяет AMD модуль посредством метода &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;. Объявдяемым элементом в этом модуле является функция, которая используется так же, как и функция, регистрируемая вызовом &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;, однако при этом подгрузка компонента произойдёт лениво - при первом его использовании.&lt;br /&gt;
&lt;br /&gt;
=== Компоненты ===&lt;br /&gt;
&amp;lt;big&amp;gt;API React компонентов описывается в соответствующих файлах в &amp;lt;code&amp;gt;propTypes&amp;lt;/code&amp;gt; React компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты, не указанные ниже, не являются частью API. По соглашениям именования мы сопоставляем имя компонента &amp;lt;code&amp;gt;ComponentName&amp;lt;/code&amp;gt; SystemJS модулю &amp;lt;code&amp;gt;component/componentName&amp;lt;/code&amp;gt;, который находится в файле &amp;lt;code&amp;gt;component/componentName.js&amp;lt;/code&amp;gt; (или &amp;lt;code&amp;gt;component/componentName.jsx&amp;lt;/code&amp;gt;, если для вашего проекта настроена компиляция JSX).&lt;br /&gt;
&lt;br /&gt;
==== Be5Block ====&lt;br /&gt;
Простая таблица внутри Bootstrap 4 Card.&lt;br /&gt;
&lt;br /&gt;
==== Be5Form ====&lt;br /&gt;
Простая форма внутри Bootstrap 4 Card.&lt;br /&gt;
&lt;br /&gt;
==== Be5View ====&lt;br /&gt;
Обобщённый компонент для таблиц, форм и статических страниц.&lt;br /&gt;
&lt;br /&gt;
==== SimpleTable ====&lt;br /&gt;
Простая таблица.&lt;br /&gt;
&lt;br /&gt;
==== SimpleForm ====&lt;br /&gt;
Простая форма.&lt;br /&gt;
&lt;br /&gt;
==== Document ====&lt;br /&gt;
Место для любого документа, в т.ч. формы или таблицы.&lt;br /&gt;
&lt;br /&gt;
== REST API ==&lt;br /&gt;
Запросы отсылаются с телом &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== document ===&lt;br /&gt;
Пример запроса (здесь указано содержимое тела запроса - на самом деле оно выглядит несколько иначе, поскольку кодируется в &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 category: servers&lt;br /&gt;
 page: All records&lt;br /&gt;
 values:&lt;br /&gt;
&lt;br /&gt;
Пример таблицы:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;table&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Servers: All records&amp;quot;,&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;servers&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;operations&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;visibleWhen&amp;quot;: &amp;quot;anySelected&amp;quot;,&lt;br /&gt;
       &amp;quot;requiresConfirmation&amp;quot;: false,&lt;br /&gt;
       &amp;quot;isClientSide&amp;quot;: false&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;selectable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;columns&amp;quot;: [ &amp;quot;Edit&amp;quot;, &amp;quot;Provider&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;Name&amp;quot;, &amp;quot;Address&amp;quot;, &amp;quot;Description&amp;quot;, &amp;quot;Products&amp;quot;, &amp;quot;Remote address&amp;quot; ],&lt;br /&gt;
     &amp;quot;rows&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;length&amp;quot;: 20,&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;totalNumberOfRows&amp;quot;: 20&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== document/count ===&lt;br /&gt;
Запрос выглядит так же, как и у &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 { &amp;quot;value&amp;quot;: 3 }&lt;br /&gt;
&lt;br /&gt;
=== form ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 values:&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;form&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;groups&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;selectedRows&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;fields&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;language&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Language&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;comboBox&amp;quot;,&lt;br /&gt;
       &amp;quot;options&amp;quot;: [ {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Afar&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
       }, ..., {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Zulu&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;zu&amp;quot;&lt;br /&gt;
       } ],&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;en&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;description&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Description&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textArea&amp;quot;,&lt;br /&gt;
       &amp;quot;columns&amp;quot;: 40,&lt;br /&gt;
       &amp;quot;rows&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;maxUsers&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Max Users&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: true,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;isViewParameters&amp;quot;: false&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== form/apply ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 values: [{&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;language&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;en&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;description&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;maxUsers&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;required&amp;quot;:false}]&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   type: &amp;quot;formResult&amp;quot;,&lt;br /&gt;
   value: {&lt;br /&gt;
     content: &amp;quot;&amp;quot;,&lt;br /&gt;
     redirect: &amp;quot;table/groups/All records&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5_API</id>
		<title>BeanExplorer5 API</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5_API"/>
				<updated>2015-11-25T09:13:38Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Frontend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Backend ==&lt;br /&gt;
&amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При сборке BeanExplorer5 проекта он воспринимается как OSGi бандл, поэтому у него должен быть манифест &amp;lt;code&amp;gt;META-INF/MANIFEST.MF&amp;lt;/code&amp;gt;. В этом манифесте указывается, от каких бандлов зависит данный бандл. Основные классы API находятся в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;, поэтому его необходимо указать в манифесте.&lt;br /&gt;
&lt;br /&gt;
Помимо этого в структуру BeanExplorer5 проекта входит &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;, в котором возможно объявлять свои компоненты, используя точку расширения &amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt;, которая объявлена в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;. Пример объявления компонента:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;extension point=&amp;quot;com.beanexplorer.be5.component&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;component&lt;br /&gt;
     class=&amp;quot;com.beanexplorer.enterprise.components.Menu&amp;quot;&lt;br /&gt;
     id=&amp;quot;menu&amp;quot;&lt;br /&gt;
     name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указанный класс должен реализовывать интерфейс &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 package com.beanexplorer.enterprise.components;&lt;br /&gt;
 &lt;br /&gt;
 public interface Component {&lt;br /&gt;
   void generate(ComponentParameters parameters);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt; - это единственная точка расширения BeanExplorer5, она позволяет регистрировать свои backend компоненты, которые будут доступны следующим URL:&lt;br /&gt;
&lt;br /&gt;
 //domain/app/main/:componentId&lt;br /&gt;
 //domain/app/main/:componentId/:any/:path&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu/withIds&lt;br /&gt;
&lt;br /&gt;
При запросе к веб-приложению по этим запросам будет создан новый экземпляр компонента и вызван его метод generate. Для того, чтобы узнать путь после имени компонента (&amp;lt;code&amp;gt;:any/:path&amp;lt;/code&amp;gt;), нужно вызвать метод &amp;lt;code&amp;gt;parameters.getRequestUri()&amp;lt;/code&amp;gt;. В случае пустого пути возвращается пустая строка. В случае наличия пути, он возвращается без начального слеша.&lt;br /&gt;
&lt;br /&gt;
=== Основные интерфейсы и классы API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt; - главный интерфейс, который должны реализовывать BE5 компоненты. Поскольку проще всего общаться с frontend посредством пересылки JSON, существуют абстрактные классы, которые упрощают написание таких компонентов:&lt;br /&gt;
** &amp;lt;code&amp;gt;JsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий строку, представляющую собой JSON.&lt;br /&gt;
** &amp;lt;code&amp;gt;NetSfJsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий &amp;lt;code&amp;gt;net.sf.json.JSONObject&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComponentParameters&amp;lt;/code&amp;gt; - всё, что необходимо компоненту. Если необходимо что-то ещё, то либо мы что-то забыли или не предусмотрели (и об этом непременно стоит сообщить нам), либо вы неправильно используете API BeanExplorer5. К чему возможно доступиться из этого компонента:&lt;br /&gt;
** &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; - BE4 проект.&lt;br /&gt;
** &amp;lt;code&amp;gt;Meta&amp;lt;/code&amp;gt; - полезные методы для работы с BE4 проектом.&lt;br /&gt;
** &amp;lt;code&amp;gt;UserService&amp;lt;/code&amp;gt; - работа с сессиями, ролями, выбором языка.&lt;br /&gt;
** &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt; - формирование текстового ответа. Необходимо только для абстрактных компонентов, обеспечивающих обмен текстовыми сообщениями в каком-нибудь формате (JSON, XML и т.п.).&lt;br /&gt;
** &amp;lt;code&amp;gt;HttpServletRequest&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;HttpServletResponse&amp;lt;/code&amp;gt; - предполагается, что в обычной ситуации они не используются. Необходимы только для реализации абстрактных компонентов, обеспечивающих работу с каким-нибудь протоколом на низком уровне. Для обмена текстом достаточно &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Обратите внимание на то, что другие классы не являются частью API, в т.ч. класс Be5 и классы, связанные с реализацией конкретных компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Частью API также являются соглашения о том, какие данные возвращают компоненты, поскольку эти соглашения используются обмена сообщениями между frontend и backend частями компонентов. Исключением являются соглашения о том, какие данные возвращают компоненты, описанные в разделе [[#REST API|REST API]].&lt;br /&gt;
&lt;br /&gt;
== Frontend ==&lt;br /&gt;
&amp;lt;big&amp;gt;Компоненты BE5 на frontend - это React.js компоненты.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты подключаются через SystemJS, при этом используется синтаксис ES2015 или метод &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 import Component from 'components/component';&lt;br /&gt;
&lt;br /&gt;
 define([ 'components/component' ], function(Component) {&lt;br /&gt;
   // use(Component)&lt;br /&gt;
   // ...&lt;br /&gt;
   return {};&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Кнопки и ссылки на компоненты (в частности запросы и формы) в BE5 не должны писаться вручную. &lt;br /&gt;
&lt;br /&gt;
Не всё, что находится в проекте be5-frontend, является частью API.&lt;br /&gt;
&lt;br /&gt;
=== Основные части API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; - ядро frontend. Функции, являющиеся частью API:&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.net.request: function(path, params, success, failure)&amp;lt;/code&amp;gt; - делает асинхронный POST запрос к ''вашему'' backend компоненту (&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;componentId/any/path&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.registerAction: function(actionName, fn)&amp;lt;/code&amp;gt; - регистрирует действие, которое будет вызвано при клике по кнопке или ссылке. Вызов действия является следствием смены hash url, при этом адрес разбирается на позиционные и именованные параметры. В зарегистрированную функцию передаются все позиционные параметры, за которыми идёт объект с именованными параметрами. Именованными параметрами считаются части URL, которые содержат символ '=', а позиционными считаются все остальные.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.registerDocumentType: function(type, creator)&amp;lt;/code&amp;gt; - регистрирует новый вид документа. Функция, переданная вторым параметром в &amp;lt;code&amp;gt;registerDocumentType&amp;lt;/code&amp;gt; обычно вызывает &amp;lt;code&amp;gt;React.createElement&amp;lt;/code&amp;gt; и возвращает результат вызова. Результат будет помещён в стандартное для проекта место отображения документа. На данный момент на backend невозможно добавлять свои виды документов, но документ возможно создать посредством вызова &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt; - пересоздаёт документ. В качестве аргумента передаётся объект с двумя полями: &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. Первое указывает тип документа, второе - значение документа, которое интерпретируется обработчиком документа, зарегистрированным посредством вызова &amp;lt;code&amp;gt;be5.ui.registerDocumentType&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.createDocument&amp;lt;/code&amp;gt; - похож на &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;, однако позволяет встраивать документы в произвольное место страницы. Полезно, если тип документа заранее неизвестен.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.load.css(path)&amp;lt;/code&amp;gt; - подгружает CSS динамически, это необходимо во frontend компонентах, которым нужен CSS. &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - путь к файлу CSS, например &amp;lt;code&amp;gt;css/menu.css&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.messages&amp;lt;/code&amp;gt; - объект с локализованными сообщениями (русский и английский язык).&lt;br /&gt;
&lt;br /&gt;
==== Другой способ определения действий ====&lt;br /&gt;
Вы также можете определить действие неявным способом не вызывая &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;. Для этого создаётся файл с именем &amp;lt;code&amp;gt;/actions/yourAction.js&amp;lt;/code&amp;gt;, который определяет AMD модуль посредством метода &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;. Объявдяемым элементом в этом модуле является функция, которая используется так же, как и функция, регистрируемая вызовом &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;, однако при этом подгрузка компонента произойдёт лениво - при первом его использовании.&lt;br /&gt;
&lt;br /&gt;
=== Компоненты ===&lt;br /&gt;
API React компонентов описывается в соответствующих файлах в &amp;lt;code&amp;gt;propTypes&amp;lt;/code&amp;gt; React компонентов. Компоненты, не указанные ниже, не являются частью API. По соглашениям именования мы сопоставляем имя компонента &amp;lt;code&amp;gt;ComponentName&amp;lt;/code&amp;gt; SystemJS модулю &amp;lt;code&amp;gt;component/componentName&amp;lt;/code&amp;gt;, который находится в файле &amp;lt;code&amp;gt;component/componentName.js&amp;lt;/code&amp;gt; (или &amp;lt;code&amp;gt;component/componentName.jsx&amp;lt;/code&amp;gt;, если для вашего проекта настроена компиляция JSX).&lt;br /&gt;
&lt;br /&gt;
==== Be5Block ====&lt;br /&gt;
Простая таблица внутри Bootstrap 4 Card.&lt;br /&gt;
&lt;br /&gt;
==== Be5Form ====&lt;br /&gt;
Простая форма внутри Bootstrap 4 Card.&lt;br /&gt;
&lt;br /&gt;
==== Be5View ====&lt;br /&gt;
Обобщённый компонент для таблиц, форм и статических страниц.&lt;br /&gt;
&lt;br /&gt;
==== SimpleTable ====&lt;br /&gt;
Простая таблица.&lt;br /&gt;
&lt;br /&gt;
==== SimpleForm ====&lt;br /&gt;
Простая форма.&lt;br /&gt;
&lt;br /&gt;
==== Document ====&lt;br /&gt;
Место для любого документа, в т.ч. формы или таблицы.&lt;br /&gt;
&lt;br /&gt;
== REST API ==&lt;br /&gt;
Запросы отсылаются с телом &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== document ===&lt;br /&gt;
Пример запроса (здесь указано содержимое тела запроса - на самом деле оно выглядит несколько иначе, поскольку кодируется в &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 category: servers&lt;br /&gt;
 page: All records&lt;br /&gt;
 values:&lt;br /&gt;
&lt;br /&gt;
Пример таблицы:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;table&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Servers: All records&amp;quot;,&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;servers&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;operations&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;visibleWhen&amp;quot;: &amp;quot;anySelected&amp;quot;,&lt;br /&gt;
       &amp;quot;requiresConfirmation&amp;quot;: false,&lt;br /&gt;
       &amp;quot;isClientSide&amp;quot;: false&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;selectable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;columns&amp;quot;: [ &amp;quot;Edit&amp;quot;, &amp;quot;Provider&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;Name&amp;quot;, &amp;quot;Address&amp;quot;, &amp;quot;Description&amp;quot;, &amp;quot;Products&amp;quot;, &amp;quot;Remote address&amp;quot; ],&lt;br /&gt;
     &amp;quot;rows&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;length&amp;quot;: 20,&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;totalNumberOfRows&amp;quot;: 20&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== document/count ===&lt;br /&gt;
Запрос выглядит так же, как и у &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 { &amp;quot;value&amp;quot;: 3 }&lt;br /&gt;
&lt;br /&gt;
=== form ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 values:&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;form&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;groups&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;selectedRows&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;fields&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;language&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Language&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;comboBox&amp;quot;,&lt;br /&gt;
       &amp;quot;options&amp;quot;: [ {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Afar&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
       }, ..., {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Zulu&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;zu&amp;quot;&lt;br /&gt;
       } ],&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;en&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;description&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Description&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textArea&amp;quot;,&lt;br /&gt;
       &amp;quot;columns&amp;quot;: 40,&lt;br /&gt;
       &amp;quot;rows&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;maxUsers&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Max Users&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: true,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;isViewParameters&amp;quot;: false&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== form/apply ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 values: [{&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;language&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;en&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;description&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;maxUsers&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;required&amp;quot;:false}]&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   type: &amp;quot;formResult&amp;quot;,&lt;br /&gt;
   value: {&lt;br /&gt;
     content: &amp;quot;&amp;quot;,&lt;br /&gt;
     redirect: &amp;quot;table/groups/All records&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5_API</id>
		<title>BeanExplorer5 API</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5_API"/>
				<updated>2015-11-25T08:14:54Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* REST API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Backend ==&lt;br /&gt;
&amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При сборке BeanExplorer5 проекта он воспринимается как OSGi бандл, поэтому у него должен быть манифест &amp;lt;code&amp;gt;META-INF/MANIFEST.MF&amp;lt;/code&amp;gt;. В этом манифесте указывается, от каких бандлов зависит данный бандл. Основные классы API находятся в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;, поэтому его необходимо указать в манифесте.&lt;br /&gt;
&lt;br /&gt;
Помимо этого в структуру BeanExplorer5 проекта входит &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;, в котором возможно объявлять свои компоненты, используя точку расширения &amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt;, которая объявлена в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;. Пример объявления компонента:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;extension point=&amp;quot;com.beanexplorer.be5.component&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;component&lt;br /&gt;
     class=&amp;quot;com.beanexplorer.enterprise.components.Menu&amp;quot;&lt;br /&gt;
     id=&amp;quot;menu&amp;quot;&lt;br /&gt;
     name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указанный класс должен реализовывать интерфейс &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 package com.beanexplorer.enterprise.components;&lt;br /&gt;
 &lt;br /&gt;
 public interface Component {&lt;br /&gt;
   void generate(ComponentParameters parameters);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt; - это единственная точка расширения BeanExplorer5, она позволяет регистрировать свои backend компоненты, которые будут доступны следующим URL:&lt;br /&gt;
&lt;br /&gt;
 //domain/app/main/:componentId&lt;br /&gt;
 //domain/app/main/:componentId/:any/:path&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu/withIds&lt;br /&gt;
&lt;br /&gt;
При запросе к веб-приложению по этим запросам будет создан новый экземпляр компонента и вызван его метод generate. Для того, чтобы узнать путь после имени компонента (&amp;lt;code&amp;gt;:any/:path&amp;lt;/code&amp;gt;), нужно вызвать метод &amp;lt;code&amp;gt;parameters.getRequestUri()&amp;lt;/code&amp;gt;. В случае пустого пути возвращается пустая строка. В случае наличия пути, он возвращается без начального слеша.&lt;br /&gt;
&lt;br /&gt;
=== Основные интерфейсы и классы API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt; - главный интерфейс, который должны реализовывать BE5 компоненты. Поскольку проще всего общаться с frontend посредством пересылки JSON, существуют абстрактные классы, которые упрощают написание таких компонентов:&lt;br /&gt;
** &amp;lt;code&amp;gt;JsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий строку, представляющую собой JSON.&lt;br /&gt;
** &amp;lt;code&amp;gt;NetSfJsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий &amp;lt;code&amp;gt;net.sf.json.JSONObject&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComponentParameters&amp;lt;/code&amp;gt; - всё, что необходимо компоненту. Если необходимо что-то ещё, то либо мы что-то забыли или не предусмотрели (и об этом непременно стоит сообщить нам), либо вы неправильно используете API BeanExplorer5. К чему возможно доступиться из этого компонента:&lt;br /&gt;
** &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; - BE4 проект.&lt;br /&gt;
** &amp;lt;code&amp;gt;Meta&amp;lt;/code&amp;gt; - полезные методы для работы с BE4 проектом.&lt;br /&gt;
** &amp;lt;code&amp;gt;UserService&amp;lt;/code&amp;gt; - работа с сессиями, ролями, выбором языка.&lt;br /&gt;
** &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt; - формирование текстового ответа. Необходимо только для абстрактных компонентов, обеспечивающих обмен текстовыми сообщениями в каком-нибудь формате (JSON, XML и т.п.).&lt;br /&gt;
** &amp;lt;code&amp;gt;HttpServletRequest&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;HttpServletResponse&amp;lt;/code&amp;gt; - предполагается, что в обычной ситуации они не используются. Необходимы только для реализации абстрактных компонентов, обеспечивающих работу с каким-нибудь протоколом на низком уровне. Для обмена текстом достаточно &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Обратите внимание на то, что другие классы не являются частью API, в т.ч. класс Be5 и классы, связанные с реализацией конкретных компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Частью API также являются соглашения о том, какие данные возвращают компоненты, поскольку эти соглашения используются обмена сообщениями между frontend и backend частями компонентов. Исключением являются соглашения о том, какие данные возвращают компоненты, описанные в разделе [[#REST API|REST API]].&lt;br /&gt;
&lt;br /&gt;
== Frontend ==&lt;br /&gt;
&amp;lt;big&amp;gt;Компоненты BE5 на frontend - это React.js компоненты.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты подключаются через SystemJS, при этом используется синтаксис ES2015 или метод &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 import Component from 'components/component';&lt;br /&gt;
&lt;br /&gt;
 define([ 'components/component' ], function(Component) {&lt;br /&gt;
   // use(Component)&lt;br /&gt;
   // ...&lt;br /&gt;
   return {};&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Кнопки и ссылки на компоненты (в частности запросы и формы) в BE5 не должны писаться вручную. &lt;br /&gt;
&lt;br /&gt;
Не всё, что находится в проекте be5-frontend, является частью API.&lt;br /&gt;
&lt;br /&gt;
=== Основные части API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; - ядро frontend. Функции, являющиеся частью API:&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.net.request: function(path, params, success, failure)&amp;lt;/code&amp;gt; - делает асинхронный POST запрос к ''вашему'' backend компоненту (&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;componentId/any/path&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.registerAction: function(actionName, fn)&amp;lt;/code&amp;gt; - регистрирует действие, которое будет вызвано при клике по кнопке или ссылке. Вызов действия является следствием смены hash url, при этом адрес разбирается на позиционные и именованные параметры. В зарегистрированную функцию передаются все позиционные параметры, за которыми идёт объект с именованными параметрами. Именованными параметрами считаются части URL, которые содержат символ '=', а позиционными считаются все остальные.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.registerDocumentType: function(type, creator)&amp;lt;/code&amp;gt; - регистрирует новый вид документа. Функция, переданная вторым параметром в &amp;lt;code&amp;gt;registerDocumentType&amp;lt;/code&amp;gt; обычно вызывает &amp;lt;code&amp;gt;React.createElement&amp;lt;/code&amp;gt; и возвращает результат вызова. Результат будет помещён в стандартное для проекта место отображения документа. На данный момент на backend невозможно добавлять свои виды документов, но документ возможно создать посредством вызова &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt; - пересоздаёт документ. В качестве аргумента передаётся объект с двумя полями: &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. Первое указывает тип документа, второе - значение документа, которое интерпретируется обработчиком документа, зарегистрированным посредством вызова &amp;lt;code&amp;gt;be5.ui.registerDocumentType&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.createDocument&amp;lt;/code&amp;gt; - похож на &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;, однако позволяет встраивать документы в произвольное место страницы. Полезно, если тип документа заранее неизвестен.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.load.css(path)&amp;lt;/code&amp;gt; - подгружает CSS динамически, это необходимо во frontend компонентах, которым нужен CSS. &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - путь к файлу CSS, например &amp;lt;code&amp;gt;css/menu.css&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.messages&amp;lt;/code&amp;gt; - объект с локализованными сообщениями (русский и английский язык).&lt;br /&gt;
&lt;br /&gt;
==== Другой способ определения действий ====&lt;br /&gt;
Вы также можете определить действие неявным способом не вызывая &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;. Для этого создаётся файл с именем &amp;lt;code&amp;gt;/actions/yourAction.js&amp;lt;/code&amp;gt;, который определяет AMD модуль посредством метода &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;. Объявдяемым элементом в этом модуле является функция, которая используется так же, как и функция, регистрируемая вызовом &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;, однако при этом подгрузка компонента произойдёт лениво - при первом его использовании.&lt;br /&gt;
&lt;br /&gt;
== REST API ==&lt;br /&gt;
Запросы отсылаются с телом &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== document ===&lt;br /&gt;
Пример запроса (здесь указано содержимое тела запроса - на самом деле оно выглядит несколько иначе, поскольку кодируется в &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 category: servers&lt;br /&gt;
 page: All records&lt;br /&gt;
 values:&lt;br /&gt;
&lt;br /&gt;
Пример таблицы:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;table&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Servers: All records&amp;quot;,&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;servers&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;operations&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;visibleWhen&amp;quot;: &amp;quot;anySelected&amp;quot;,&lt;br /&gt;
       &amp;quot;requiresConfirmation&amp;quot;: false,&lt;br /&gt;
       &amp;quot;isClientSide&amp;quot;: false&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;selectable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;columns&amp;quot;: [ &amp;quot;Edit&amp;quot;, &amp;quot;Provider&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;Name&amp;quot;, &amp;quot;Address&amp;quot;, &amp;quot;Description&amp;quot;, &amp;quot;Products&amp;quot;, &amp;quot;Remote address&amp;quot; ],&lt;br /&gt;
     &amp;quot;rows&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;length&amp;quot;: 20,&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;totalNumberOfRows&amp;quot;: 20&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== document/count ===&lt;br /&gt;
Запрос выглядит так же, как и у &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 { &amp;quot;value&amp;quot;: 3 }&lt;br /&gt;
&lt;br /&gt;
=== form ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 values:&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;form&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;groups&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;selectedRows&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;fields&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;language&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Language&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;comboBox&amp;quot;,&lt;br /&gt;
       &amp;quot;options&amp;quot;: [ {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Afar&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
       }, ..., {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Zulu&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;zu&amp;quot;&lt;br /&gt;
       } ],&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;en&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;description&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Description&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textArea&amp;quot;,&lt;br /&gt;
       &amp;quot;columns&amp;quot;: 40,&lt;br /&gt;
       &amp;quot;rows&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;maxUsers&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Max Users&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: true,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;isViewParameters&amp;quot;: false&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== form/apply ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 values: [{&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;language&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;en&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;description&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;maxUsers&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;required&amp;quot;:false}]&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   type: &amp;quot;formResult&amp;quot;,&lt;br /&gt;
   value: {&lt;br /&gt;
     content: &amp;quot;&amp;quot;,&lt;br /&gt;
     redirect: &amp;quot;table/groups/All records&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5_API</id>
		<title>BeanExplorer5 API</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5_API"/>
				<updated>2015-11-25T08:14:21Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* REST API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Backend ==&lt;br /&gt;
&amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При сборке BeanExplorer5 проекта он воспринимается как OSGi бандл, поэтому у него должен быть манифест &amp;lt;code&amp;gt;META-INF/MANIFEST.MF&amp;lt;/code&amp;gt;. В этом манифесте указывается, от каких бандлов зависит данный бандл. Основные классы API находятся в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;, поэтому его необходимо указать в манифесте.&lt;br /&gt;
&lt;br /&gt;
Помимо этого в структуру BeanExplorer5 проекта входит &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;, в котором возможно объявлять свои компоненты, используя точку расширения &amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt;, которая объявлена в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;. Пример объявления компонента:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;extension point=&amp;quot;com.beanexplorer.be5.component&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;component&lt;br /&gt;
     class=&amp;quot;com.beanexplorer.enterprise.components.Menu&amp;quot;&lt;br /&gt;
     id=&amp;quot;menu&amp;quot;&lt;br /&gt;
     name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указанный класс должен реализовывать интерфейс &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 package com.beanexplorer.enterprise.components;&lt;br /&gt;
 &lt;br /&gt;
 public interface Component {&lt;br /&gt;
   void generate(ComponentParameters parameters);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt; - это единственная точка расширения BeanExplorer5, она позволяет регистрировать свои backend компоненты, которые будут доступны следующим URL:&lt;br /&gt;
&lt;br /&gt;
 //domain/app/main/:componentId&lt;br /&gt;
 //domain/app/main/:componentId/:any/:path&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu/withIds&lt;br /&gt;
&lt;br /&gt;
При запросе к веб-приложению по этим запросам будет создан новый экземпляр компонента и вызван его метод generate. Для того, чтобы узнать путь после имени компонента (&amp;lt;code&amp;gt;:any/:path&amp;lt;/code&amp;gt;), нужно вызвать метод &amp;lt;code&amp;gt;parameters.getRequestUri()&amp;lt;/code&amp;gt;. В случае пустого пути возвращается пустая строка. В случае наличия пути, он возвращается без начального слеша.&lt;br /&gt;
&lt;br /&gt;
=== Основные интерфейсы и классы API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt; - главный интерфейс, который должны реализовывать BE5 компоненты. Поскольку проще всего общаться с frontend посредством пересылки JSON, существуют абстрактные классы, которые упрощают написание таких компонентов:&lt;br /&gt;
** &amp;lt;code&amp;gt;JsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий строку, представляющую собой JSON.&lt;br /&gt;
** &amp;lt;code&amp;gt;NetSfJsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий &amp;lt;code&amp;gt;net.sf.json.JSONObject&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComponentParameters&amp;lt;/code&amp;gt; - всё, что необходимо компоненту. Если необходимо что-то ещё, то либо мы что-то забыли или не предусмотрели (и об этом непременно стоит сообщить нам), либо вы неправильно используете API BeanExplorer5. К чему возможно доступиться из этого компонента:&lt;br /&gt;
** &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; - BE4 проект.&lt;br /&gt;
** &amp;lt;code&amp;gt;Meta&amp;lt;/code&amp;gt; - полезные методы для работы с BE4 проектом.&lt;br /&gt;
** &amp;lt;code&amp;gt;UserService&amp;lt;/code&amp;gt; - работа с сессиями, ролями, выбором языка.&lt;br /&gt;
** &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt; - формирование текстового ответа. Необходимо только для абстрактных компонентов, обеспечивающих обмен текстовыми сообщениями в каком-нибудь формате (JSON, XML и т.п.).&lt;br /&gt;
** &amp;lt;code&amp;gt;HttpServletRequest&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;HttpServletResponse&amp;lt;/code&amp;gt; - предполагается, что в обычной ситуации они не используются. Необходимы только для реализации абстрактных компонентов, обеспечивающих работу с каким-нибудь протоколом на низком уровне. Для обмена текстом достаточно &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Обратите внимание на то, что другие классы не являются частью API, в т.ч. класс Be5 и классы, связанные с реализацией конкретных компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Частью API также являются соглашения о том, какие данные возвращают компоненты, поскольку эти соглашения используются обмена сообщениями между frontend и backend частями компонентов. Исключением являются соглашения о том, какие данные возвращают компоненты, описанные в разделе [[#REST API|REST API]].&lt;br /&gt;
&lt;br /&gt;
== Frontend ==&lt;br /&gt;
&amp;lt;big&amp;gt;Компоненты BE5 на frontend - это React.js компоненты.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты подключаются через SystemJS, при этом используется синтаксис ES2015 или метод &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 import Component from 'components/component';&lt;br /&gt;
&lt;br /&gt;
 define([ 'components/component' ], function(Component) {&lt;br /&gt;
   // use(Component)&lt;br /&gt;
   // ...&lt;br /&gt;
   return {};&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Кнопки и ссылки на компоненты (в частности запросы и формы) в BE5 не должны писаться вручную. &lt;br /&gt;
&lt;br /&gt;
Не всё, что находится в проекте be5-frontend, является частью API.&lt;br /&gt;
&lt;br /&gt;
=== Основные части API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; - ядро frontend. Функции, являющиеся частью API:&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.net.request: function(path, params, success, failure)&amp;lt;/code&amp;gt; - делает асинхронный POST запрос к ''вашему'' backend компоненту (&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;componentId/any/path&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.registerAction: function(actionName, fn)&amp;lt;/code&amp;gt; - регистрирует действие, которое будет вызвано при клике по кнопке или ссылке. Вызов действия является следствием смены hash url, при этом адрес разбирается на позиционные и именованные параметры. В зарегистрированную функцию передаются все позиционные параметры, за которыми идёт объект с именованными параметрами. Именованными параметрами считаются части URL, которые содержат символ '=', а позиционными считаются все остальные.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.registerDocumentType: function(type, creator)&amp;lt;/code&amp;gt; - регистрирует новый вид документа. Функция, переданная вторым параметром в &amp;lt;code&amp;gt;registerDocumentType&amp;lt;/code&amp;gt; обычно вызывает &amp;lt;code&amp;gt;React.createElement&amp;lt;/code&amp;gt; и возвращает результат вызова. Результат будет помещён в стандартное для проекта место отображения документа. На данный момент на backend невозможно добавлять свои виды документов, но документ возможно создать посредством вызова &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt; - пересоздаёт документ. В качестве аргумента передаётся объект с двумя полями: &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. Первое указывает тип документа, второе - значение документа, которое интерпретируется обработчиком документа, зарегистрированным посредством вызова &amp;lt;code&amp;gt;be5.ui.registerDocumentType&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.createDocument&amp;lt;/code&amp;gt; - похож на &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;, однако позволяет встраивать документы в произвольное место страницы. Полезно, если тип документа заранее неизвестен.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.load.css(path)&amp;lt;/code&amp;gt; - подгружает CSS динамически, это необходимо во frontend компонентах, которым нужен CSS. &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - путь к файлу CSS, например &amp;lt;code&amp;gt;css/menu.css&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.messages&amp;lt;/code&amp;gt; - объект с локализованными сообщениями (русский и английский язык).&lt;br /&gt;
&lt;br /&gt;
==== Другой способ определения действий ====&lt;br /&gt;
Вы также можете определить действие неявным способом не вызывая &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;. Для этого создаётся файл с именем &amp;lt;code&amp;gt;/actions/yourAction.js&amp;lt;/code&amp;gt;, который определяет AMD модуль посредством метода &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;. Объявдяемым элементом в этом модуле является функция, которая используется так же, как и функция, регистрируемая вызовом &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;, однако при этом подгрузка компонента произойдёт лениво - при первом его использовании.&lt;br /&gt;
&lt;br /&gt;
== REST API ==&lt;br /&gt;
Запросы отсылаются в телом &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== document ===&lt;br /&gt;
Пример запроса (здесь указано содержимое тела запроса - на самом деле оно выглядит несколько иначе, поскольку кодируется в &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 category: servers&lt;br /&gt;
 page: All records&lt;br /&gt;
 values:&lt;br /&gt;
&lt;br /&gt;
Пример таблицы:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;table&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Servers: All records&amp;quot;,&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;servers&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;operations&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;visibleWhen&amp;quot;: &amp;quot;anySelected&amp;quot;,&lt;br /&gt;
       &amp;quot;requiresConfirmation&amp;quot;: false,&lt;br /&gt;
       &amp;quot;isClientSide&amp;quot;: false&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;selectable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;columns&amp;quot;: [ &amp;quot;Edit&amp;quot;, &amp;quot;Provider&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;Name&amp;quot;, &amp;quot;Address&amp;quot;, &amp;quot;Description&amp;quot;, &amp;quot;Products&amp;quot;, &amp;quot;Remote address&amp;quot; ],&lt;br /&gt;
     &amp;quot;rows&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;length&amp;quot;: 20,&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;totalNumberOfRows&amp;quot;: 20&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== document/count ===&lt;br /&gt;
Запрос выглядит так же, как и у &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 { &amp;quot;value&amp;quot;: 3 }&lt;br /&gt;
&lt;br /&gt;
=== form ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 values:&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;form&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;groups&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;selectedRows&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;fields&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;language&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Language&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;comboBox&amp;quot;,&lt;br /&gt;
       &amp;quot;options&amp;quot;: [ {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Afar&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
       }, ..., {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Zulu&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;zu&amp;quot;&lt;br /&gt;
       } ],&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;en&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;description&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Description&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textArea&amp;quot;,&lt;br /&gt;
       &amp;quot;columns&amp;quot;: 40,&lt;br /&gt;
       &amp;quot;rows&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;maxUsers&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Max Users&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: true,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;isViewParameters&amp;quot;: false&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== form/apply ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 values: [{&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;language&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;en&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;description&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;maxUsers&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;required&amp;quot;:false}]&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   type: &amp;quot;formResult&amp;quot;,&lt;br /&gt;
   value: {&lt;br /&gt;
     content: &amp;quot;&amp;quot;,&lt;br /&gt;
     redirect: &amp;quot;table/groups/All records&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5_API</id>
		<title>BeanExplorer5 API</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5_API"/>
				<updated>2015-11-25T07:36:36Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Основные интерфейсы и классы API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Backend ==&lt;br /&gt;
&amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При сборке BeanExplorer5 проекта он воспринимается как OSGi бандл, поэтому у него должен быть манифест &amp;lt;code&amp;gt;META-INF/MANIFEST.MF&amp;lt;/code&amp;gt;. В этом манифесте указывается, от каких бандлов зависит данный бандл. Основные классы API находятся в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;, поэтому его необходимо указать в манифесте.&lt;br /&gt;
&lt;br /&gt;
Помимо этого в структуру BeanExplorer5 проекта входит &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;, в котором возможно объявлять свои компоненты, используя точку расширения &amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt;, которая объявлена в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;. Пример объявления компонента:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;extension point=&amp;quot;com.beanexplorer.be5.component&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;component&lt;br /&gt;
     class=&amp;quot;com.beanexplorer.enterprise.components.Menu&amp;quot;&lt;br /&gt;
     id=&amp;quot;menu&amp;quot;&lt;br /&gt;
     name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указанный класс должен реализовывать интерфейс &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 package com.beanexplorer.enterprise.components;&lt;br /&gt;
 &lt;br /&gt;
 public interface Component {&lt;br /&gt;
   void generate(ComponentParameters parameters);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt; - это единственная точка расширения BeanExplorer5, она позволяет регистрировать свои backend компоненты, которые будут доступны следующим URL:&lt;br /&gt;
&lt;br /&gt;
 //domain/app/main/:componentId&lt;br /&gt;
 //domain/app/main/:componentId/:any/:path&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu/withIds&lt;br /&gt;
&lt;br /&gt;
При запросе к веб-приложению по этим запросам будет создан новый экземпляр компонента и вызван его метод generate. Для того, чтобы узнать путь после имени компонента (&amp;lt;code&amp;gt;:any/:path&amp;lt;/code&amp;gt;), нужно вызвать метод &amp;lt;code&amp;gt;parameters.getRequestUri()&amp;lt;/code&amp;gt;. В случае пустого пути возвращается пустая строка. В случае наличия пути, он возвращается без начального слеша.&lt;br /&gt;
&lt;br /&gt;
=== Основные интерфейсы и классы API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt; - главный интерфейс, который должны реализовывать BE5 компоненты. Поскольку проще всего общаться с frontend посредством пересылки JSON, существуют абстрактные классы, которые упрощают написание таких компонентов:&lt;br /&gt;
** &amp;lt;code&amp;gt;JsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий строку, представляющую собой JSON.&lt;br /&gt;
** &amp;lt;code&amp;gt;NetSfJsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий &amp;lt;code&amp;gt;net.sf.json.JSONObject&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComponentParameters&amp;lt;/code&amp;gt; - всё, что необходимо компоненту. Если необходимо что-то ещё, то либо мы что-то забыли или не предусмотрели (и об этом непременно стоит сообщить нам), либо вы неправильно используете API BeanExplorer5. К чему возможно доступиться из этого компонента:&lt;br /&gt;
** &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; - BE4 проект.&lt;br /&gt;
** &amp;lt;code&amp;gt;Meta&amp;lt;/code&amp;gt; - полезные методы для работы с BE4 проектом.&lt;br /&gt;
** &amp;lt;code&amp;gt;UserService&amp;lt;/code&amp;gt; - работа с сессиями, ролями, выбором языка.&lt;br /&gt;
** &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt; - формирование текстового ответа. Необходимо только для абстрактных компонентов, обеспечивающих обмен текстовыми сообщениями в каком-нибудь формате (JSON, XML и т.п.).&lt;br /&gt;
** &amp;lt;code&amp;gt;HttpServletRequest&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;HttpServletResponse&amp;lt;/code&amp;gt; - предполагается, что в обычной ситуации они не используются. Необходимы только для реализации абстрактных компонентов, обеспечивающих работу с каким-нибудь протоколом на низком уровне. Для обмена текстом достаточно &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Обратите внимание на то, что другие классы не являются частью API, в т.ч. класс Be5 и классы, связанные с реализацией конкретных компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Частью API также являются соглашения о том, какие данные возвращают компоненты, поскольку эти соглашения используются обмена сообщениями между frontend и backend частями компонентов. Исключением являются соглашения о том, какие данные возвращают компоненты, описанные в разделе [[#REST API|REST API]].&lt;br /&gt;
&lt;br /&gt;
== Frontend ==&lt;br /&gt;
&amp;lt;big&amp;gt;Компоненты BE5 на frontend - это React.js компоненты.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты подключаются через SystemJS, при этом используется синтаксис ES2015 или метод &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 import Component from 'components/component';&lt;br /&gt;
&lt;br /&gt;
 define([ 'components/component' ], function(Component) {&lt;br /&gt;
   // use(Component)&lt;br /&gt;
   // ...&lt;br /&gt;
   return {};&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Кнопки и ссылки на компоненты (в частности запросы и формы) в BE5 не должны писаться вручную. &lt;br /&gt;
&lt;br /&gt;
Не всё, что находится в проекте be5-frontend, является частью API.&lt;br /&gt;
&lt;br /&gt;
=== Основные части API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; - ядро frontend. Функции, являющиеся частью API:&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.net.request: function(path, params, success, failure)&amp;lt;/code&amp;gt; - делает асинхронный POST запрос к ''вашему'' backend компоненту (&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;componentId/any/path&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.registerAction: function(actionName, fn)&amp;lt;/code&amp;gt; - регистрирует действие, которое будет вызвано при клике по кнопке или ссылке. Вызов действия является следствием смены hash url, при этом адрес разбирается на позиционные и именованные параметры. В зарегистрированную функцию передаются все позиционные параметры, за которыми идёт объект с именованными параметрами. Именованными параметрами считаются части URL, которые содержат символ '=', а позиционными считаются все остальные.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.registerDocumentType: function(type, creator)&amp;lt;/code&amp;gt; - регистрирует новый вид документа. Функция, переданная вторым параметром в &amp;lt;code&amp;gt;registerDocumentType&amp;lt;/code&amp;gt; обычно вызывает &amp;lt;code&amp;gt;React.createElement&amp;lt;/code&amp;gt; и возвращает результат вызова. Результат будет помещён в стандартное для проекта место отображения документа. На данный момент на backend невозможно добавлять свои виды документов, но документ возможно создать посредством вызова &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt; - пересоздаёт документ. В качестве аргумента передаётся объект с двумя полями: &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. Первое указывает тип документа, второе - значение документа, которое интерпретируется обработчиком документа, зарегистрированным посредством вызова &amp;lt;code&amp;gt;be5.ui.registerDocumentType&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.createDocument&amp;lt;/code&amp;gt; - похож на &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;, однако позволяет встраивать документы в произвольное место страницы. Полезно, если тип документа заранее неизвестен.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.load.css(path)&amp;lt;/code&amp;gt; - подгружает CSS динамически, это необходимо во frontend компонентах, которым нужен CSS. &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - путь к файлу CSS, например &amp;lt;code&amp;gt;css/menu.css&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.messages&amp;lt;/code&amp;gt; - объект с локализованными сообщениями (русский и английский язык).&lt;br /&gt;
&lt;br /&gt;
==== Другой способ определения действий ====&lt;br /&gt;
Вы также можете определить действие неявным способом не вызывая &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;. Для этого создаётся файл с именем &amp;lt;code&amp;gt;/actions/yourAction.js&amp;lt;/code&amp;gt;, который определяет AMD модуль посредством метода &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;. Объявдяемым элементом в этом модуле является функция, которая используется так же, как и функция, регистрируемая вызовом &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;, однако при этом подгрузка компонента произойдёт лениво - при первом его использовании.&lt;br /&gt;
&lt;br /&gt;
== REST API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5_API</id>
		<title>BeanExplorer5 API</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5_API"/>
				<updated>2015-11-25T07:35:32Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Основные интерфейсы и классы API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Backend ==&lt;br /&gt;
&amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При сборке BeanExplorer5 проекта он воспринимается как OSGi бандл, поэтому у него должен быть манифест &amp;lt;code&amp;gt;META-INF/MANIFEST.MF&amp;lt;/code&amp;gt;. В этом манифесте указывается, от каких бандлов зависит данный бандл. Основные классы API находятся в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;, поэтому его необходимо указать в манифесте.&lt;br /&gt;
&lt;br /&gt;
Помимо этого в структуру BeanExplorer5 проекта входит &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;, в котором возможно объявлять свои компоненты, используя точку расширения &amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt;, которая объявлена в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;. Пример объявления компонента:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;extension point=&amp;quot;com.beanexplorer.be5.component&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;component&lt;br /&gt;
     class=&amp;quot;com.beanexplorer.enterprise.components.Menu&amp;quot;&lt;br /&gt;
     id=&amp;quot;menu&amp;quot;&lt;br /&gt;
     name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указанный класс должен реализовывать интерфейс &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 package com.beanexplorer.enterprise.components;&lt;br /&gt;
 &lt;br /&gt;
 public interface Component {&lt;br /&gt;
   void generate(ComponentParameters parameters);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt; - это единственная точка расширения BeanExplorer5, она позволяет регистрировать свои backend компоненты, которые будут доступны следующим URL:&lt;br /&gt;
&lt;br /&gt;
 //domain/app/main/:componentId&lt;br /&gt;
 //domain/app/main/:componentId/:any/:path&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu/withIds&lt;br /&gt;
&lt;br /&gt;
При запросе к веб-приложению по этим запросам будет создан новый экземпляр компонента и вызван его метод generate. Для того, чтобы узнать путь после имени компонента (&amp;lt;code&amp;gt;:any/:path&amp;lt;/code&amp;gt;), нужно вызвать метод &amp;lt;code&amp;gt;parameters.getRequestUri()&amp;lt;/code&amp;gt;. В случае пустого пути возвращается пустая строка. В случае наличия пути, он возвращается без начального слеша.&lt;br /&gt;
&lt;br /&gt;
=== Основные интерфейсы и классы API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt; - главный интерфейс, который должны реализовывать BE5 компоненты. Поскольку проще всего общаться с frontend посредством пересылки JSON, существуют абстрактные классы, которые упрощают написание таких компонентов:&lt;br /&gt;
** &amp;lt;code&amp;gt;JsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий строку, представляющую собой JSON.&lt;br /&gt;
** &amp;lt;code&amp;gt;NetSfJsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий &amp;lt;code&amp;gt;net.sf.json.JSONObject&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComponentParameters&amp;lt;/code&amp;gt; - всё, что необходимо компоненту. Если необходимо что-то ещё, то либо мы что-то забыли или не предусмотрели (и об этом непременно стоит сообщить нам), либо вы неправильно используете API BeanExplorer5. К чему возможно доступиться из этого компонента:&lt;br /&gt;
** &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; - BE4 проект.&lt;br /&gt;
** &amp;lt;code&amp;gt;Meta&amp;lt;/code&amp;gt; - полезные методы для работы с BE4 проектом.&lt;br /&gt;
** &amp;lt;code&amp;gt;UserService&amp;lt;/code&amp;gt; - работа с сессиями, ролями, выбором языка.&lt;br /&gt;
** &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt; - формирование текстового ответа. Необходимо только для абстрактных компонентов, обеспечивающих обмен текстовыми сообщениями в каком-нибудь формате (JSON, XML и т.п.).&lt;br /&gt;
** &amp;lt;code&amp;gt;HttpServletRequest&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;HttpServletResponse&amp;lt;/code&amp;gt; - предполагается, что в обычной ситуации они не используются. Необходимы только для реализации абстрактных компонентов, обеспечивающих работу с каким-нибудь протоколом на низком уровне. Для обмена текстом достаточно &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Обратите внимание на то, что другие классы не являются частью API, в т.ч. класс Be5 и классы, связанные с реализацией конкретных компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Частью API также являются соглашения о том, какие данные возвращают компоненты, поскольку эти соглашения используются обмена сообщениями между frontend и backend частями компонентов. Исключением являются соглашения о том, какие данные возвращают компоненты, описанные в разделе [[#Rest API|REST API]].&lt;br /&gt;
&lt;br /&gt;
== Frontend ==&lt;br /&gt;
&amp;lt;big&amp;gt;Компоненты BE5 на frontend - это React.js компоненты.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты подключаются через SystemJS, при этом используется синтаксис ES2015 или метод &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 import Component from 'components/component';&lt;br /&gt;
&lt;br /&gt;
 define([ 'components/component' ], function(Component) {&lt;br /&gt;
   // use(Component)&lt;br /&gt;
   // ...&lt;br /&gt;
   return {};&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Кнопки и ссылки на компоненты (в частности запросы и формы) в BE5 не должны писаться вручную. &lt;br /&gt;
&lt;br /&gt;
Не всё, что находится в проекте be5-frontend, является частью API.&lt;br /&gt;
&lt;br /&gt;
=== Основные части API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; - ядро frontend. Функции, являющиеся частью API:&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.net.request: function(path, params, success, failure)&amp;lt;/code&amp;gt; - делает асинхронный POST запрос к ''вашему'' backend компоненту (&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;componentId/any/path&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.registerAction: function(actionName, fn)&amp;lt;/code&amp;gt; - регистрирует действие, которое будет вызвано при клике по кнопке или ссылке. Вызов действия является следствием смены hash url, при этом адрес разбирается на позиционные и именованные параметры. В зарегистрированную функцию передаются все позиционные параметры, за которыми идёт объект с именованными параметрами. Именованными параметрами считаются части URL, которые содержат символ '=', а позиционными считаются все остальные.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.registerDocumentType: function(type, creator)&amp;lt;/code&amp;gt; - регистрирует новый вид документа. Функция, переданная вторым параметром в &amp;lt;code&amp;gt;registerDocumentType&amp;lt;/code&amp;gt; обычно вызывает &amp;lt;code&amp;gt;React.createElement&amp;lt;/code&amp;gt; и возвращает результат вызова. Результат будет помещён в стандартное для проекта место отображения документа. На данный момент на backend невозможно добавлять свои виды документов, но документ возможно создать посредством вызова &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt; - пересоздаёт документ. В качестве аргумента передаётся объект с двумя полями: &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. Первое указывает тип документа, второе - значение документа, которое интерпретируется обработчиком документа, зарегистрированным посредством вызова &amp;lt;code&amp;gt;be5.ui.registerDocumentType&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.createDocument&amp;lt;/code&amp;gt; - похож на &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;, однако позволяет встраивать документы в произвольное место страницы. Полезно, если тип документа заранее неизвестен.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.load.css(path)&amp;lt;/code&amp;gt; - подгружает CSS динамически, это необходимо во frontend компонентах, которым нужен CSS. &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - путь к файлу CSS, например &amp;lt;code&amp;gt;css/menu.css&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.messages&amp;lt;/code&amp;gt; - объект с локализованными сообщениями (русский и английский язык).&lt;br /&gt;
&lt;br /&gt;
==== Другой способ определения действий ====&lt;br /&gt;
Вы также можете определить действие неявным способом не вызывая &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;. Для этого создаётся файл с именем &amp;lt;code&amp;gt;/actions/yourAction.js&amp;lt;/code&amp;gt;, который определяет AMD модуль посредством метода &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;. Объявдяемым элементом в этом модуле является функция, которая используется так же, как и функция, регистрируемая вызовом &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;, однако при этом подгрузка компонента произойдёт лениво - при первом его использовании.&lt;br /&gt;
&lt;br /&gt;
== REST API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5_API</id>
		<title>BeanExplorer5 API</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5_API"/>
				<updated>2015-11-25T07:05:12Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Основные части API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Backend ==&lt;br /&gt;
&amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При сборке BeanExplorer5 проекта он воспринимается как OSGi бандл, поэтому у него должен быть манифест &amp;lt;code&amp;gt;META-INF/MANIFEST.MF&amp;lt;/code&amp;gt;. В этом манифесте указывается, от каких бандлов зависит данный бандл. Основные классы API находятся в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;, поэтому его необходимо указать в манифесте.&lt;br /&gt;
&lt;br /&gt;
Помимо этого в структуру BeanExplorer5 проекта входит &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;, в котором возможно объявлять свои компоненты, используя точку расширения &amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt;, которая объявлена в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;. Пример объявления компонента:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;extension point=&amp;quot;com.beanexplorer.be5.component&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;component&lt;br /&gt;
     class=&amp;quot;com.beanexplorer.enterprise.components.Menu&amp;quot;&lt;br /&gt;
     id=&amp;quot;menu&amp;quot;&lt;br /&gt;
     name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указанный класс должен реализовывать интерфейс &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 package com.beanexplorer.enterprise.components;&lt;br /&gt;
 &lt;br /&gt;
 public interface Component {&lt;br /&gt;
   void generate(ComponentParameters parameters);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt; - это единственная точка расширения BeanExplorer5, она позволяет регистрировать свои backend компоненты, которые будут доступны следующим URL:&lt;br /&gt;
&lt;br /&gt;
 //domain/app/main/:componentId&lt;br /&gt;
 //domain/app/main/:componentId/:any/:path&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu/withIds&lt;br /&gt;
&lt;br /&gt;
При запросе к веб-приложению по этим запросам будет создан новый экземпляр компонента и вызван его метод generate. Для того, чтобы узнать путь после имени компонента (&amp;lt;code&amp;gt;:any/:path&amp;lt;/code&amp;gt;), нужно вызвать метод &amp;lt;code&amp;gt;parameters.getRequestUri()&amp;lt;/code&amp;gt;. В случае пустого пути возвращается пустая строка. В случае наличия пути, он возвращается без начального слеша.&lt;br /&gt;
&lt;br /&gt;
=== Основные интерфейсы и классы API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt; - главный интерфейс, который должны реализовывать BE5 компоненты. Поскольку проще всего общаться с frontend посредством пересылки JSON, существуют абстрактные классы, которые упрощают написание таких компонентов:&lt;br /&gt;
** &amp;lt;code&amp;gt;JsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий строку, представляющую собой JSON.&lt;br /&gt;
** &amp;lt;code&amp;gt;NetSfJsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий &amp;lt;code&amp;gt;net.sf.json.JSONObject&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComponentParameters&amp;lt;/code&amp;gt; - всё, что необходимо компоненту. Если необходимо что-то ещё, то либо мы что-то забыли или не предусмотрели (и об этом непременно стоит сообщить нам), либо вы неправильно используете API BeanExplorer5. К чему возможно доступиться из этого компонента:&lt;br /&gt;
** &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; - BE4 проект.&lt;br /&gt;
** &amp;lt;code&amp;gt;Meta&amp;lt;/code&amp;gt; - полезные методы для работы с BE4 проектом.&lt;br /&gt;
** &amp;lt;code&amp;gt;UserService&amp;lt;/code&amp;gt; - работа с сессиями, ролями, выбором языка.&lt;br /&gt;
** &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt; - формирование текстового ответа. Необходимо только для абстрактных компонентов, обеспечивающих обмен текстовыми сообщениями в каком-нибудь формате (JSON, XML и т.п.).&lt;br /&gt;
** &amp;lt;code&amp;gt;HttpServletRequest&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;HttpServletResponse&amp;lt;/code&amp;gt; - предполагается, что в обычной ситуации они не используются. Необходимы только для реализации абстрактных компонентов, обеспечивающих работу с каким-нибудь протоколом на низком уровне. Для обмена текстом достаточно &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Обратите внимание на то, что другие классы не являются частью API, в т.ч. класс Be5 и классы, связанные с реализацией конкретных компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Частью API также являются соглашения о том, какие данные возвращают компоненты, поскольку эти соглашения используются обмена сообщениями между frontend и backend частями компонентов. Исключением являются соглашения о том, какие данные возвращают компоненты &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;form&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Frontend ==&lt;br /&gt;
&amp;lt;big&amp;gt;Компоненты BE5 на frontend - это React.js компоненты.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты подключаются через SystemJS, при этом используется синтаксис ES2015 или метод &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 import Component from 'components/component';&lt;br /&gt;
&lt;br /&gt;
 define([ 'components/component' ], function(Component) {&lt;br /&gt;
   // use(Component)&lt;br /&gt;
   // ...&lt;br /&gt;
   return {};&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Кнопки и ссылки на компоненты (в частности запросы и формы) в BE5 не должны писаться вручную. &lt;br /&gt;
&lt;br /&gt;
Не всё, что находится в проекте be5-frontend, является частью API.&lt;br /&gt;
&lt;br /&gt;
=== Основные части API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; - ядро frontend. Функции, являющиеся частью API:&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.net.request: function(path, params, success, failure)&amp;lt;/code&amp;gt; - делает асинхронный POST запрос к ''вашему'' backend компоненту (&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;componentId/any/path&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.registerAction: function(actionName, fn)&amp;lt;/code&amp;gt; - регистрирует действие, которое будет вызвано при клике по кнопке или ссылке. Вызов действия является следствием смены hash url, при этом адрес разбирается на позиционные и именованные параметры. В зарегистрированную функцию передаются все позиционные параметры, за которыми идёт объект с именованными параметрами. Именованными параметрами считаются части URL, которые содержат символ '=', а позиционными считаются все остальные.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.registerDocumentType: function(type, creator)&amp;lt;/code&amp;gt; - регистрирует новый вид документа. Функция, переданная вторым параметром в &amp;lt;code&amp;gt;registerDocumentType&amp;lt;/code&amp;gt; обычно вызывает &amp;lt;code&amp;gt;React.createElement&amp;lt;/code&amp;gt; и возвращает результат вызова. Результат будет помещён в стандартное для проекта место отображения документа. На данный момент на backend невозможно добавлять свои виды документов, но документ возможно создать посредством вызова &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt; - пересоздаёт документ. В качестве аргумента передаётся объект с двумя полями: &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. Первое указывает тип документа, второе - значение документа, которое интерпретируется обработчиком документа, зарегистрированным посредством вызова &amp;lt;code&amp;gt;be5.ui.registerDocumentType&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.createDocument&amp;lt;/code&amp;gt; - похож на &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;, однако позволяет встраивать документы в произвольное место страницы. Полезно, если тип документа заранее неизвестен.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.load.css(path)&amp;lt;/code&amp;gt; - подгружает CSS динамически, это необходимо во frontend компонентах, которым нужен CSS. &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - путь к файлу CSS, например &amp;lt;code&amp;gt;css/menu.css&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.messages&amp;lt;/code&amp;gt; - объект с локализованными сообщениями (русский и английский язык).&lt;br /&gt;
&lt;br /&gt;
==== Другой способ определения действий ====&lt;br /&gt;
Вы также можете определить действие неявным способом не вызывая &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;. Для этого создаётся файл с именем &amp;lt;code&amp;gt;/actions/yourAction.js&amp;lt;/code&amp;gt;, который определяет AMD модуль посредством метода &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;. Объявдяемым элементом в этом модуле является функция, которая используется так же, как и функция, регистрируемая вызовом &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;, однако при этом подгрузка компонента произойдёт лениво - при первом его использовании.&lt;br /&gt;
&lt;br /&gt;
== REST API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5_API</id>
		<title>BeanExplorer5 API</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5_API"/>
				<updated>2015-11-25T06:56:08Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Backend ==&lt;br /&gt;
&amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При сборке BeanExplorer5 проекта он воспринимается как OSGi бандл, поэтому у него должен быть манифест &amp;lt;code&amp;gt;META-INF/MANIFEST.MF&amp;lt;/code&amp;gt;. В этом манифесте указывается, от каких бандлов зависит данный бандл. Основные классы API находятся в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;, поэтому его необходимо указать в манифесте.&lt;br /&gt;
&lt;br /&gt;
Помимо этого в структуру BeanExplorer5 проекта входит &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;, в котором возможно объявлять свои компоненты, используя точку расширения &amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt;, которая объявлена в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;. Пример объявления компонента:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;extension point=&amp;quot;com.beanexplorer.be5.component&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;component&lt;br /&gt;
     class=&amp;quot;com.beanexplorer.enterprise.components.Menu&amp;quot;&lt;br /&gt;
     id=&amp;quot;menu&amp;quot;&lt;br /&gt;
     name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указанный класс должен реализовывать интерфейс &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 package com.beanexplorer.enterprise.components;&lt;br /&gt;
 &lt;br /&gt;
 public interface Component {&lt;br /&gt;
   void generate(ComponentParameters parameters);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt; - это единственная точка расширения BeanExplorer5, она позволяет регистрировать свои backend компоненты, которые будут доступны следующим URL:&lt;br /&gt;
&lt;br /&gt;
 //domain/app/main/:componentId&lt;br /&gt;
 //domain/app/main/:componentId/:any/:path&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu/withIds&lt;br /&gt;
&lt;br /&gt;
При запросе к веб-приложению по этим запросам будет создан новый экземпляр компонента и вызван его метод generate. Для того, чтобы узнать путь после имени компонента (&amp;lt;code&amp;gt;:any/:path&amp;lt;/code&amp;gt;), нужно вызвать метод &amp;lt;code&amp;gt;parameters.getRequestUri()&amp;lt;/code&amp;gt;. В случае пустого пути возвращается пустая строка. В случае наличия пути, он возвращается без начального слеша.&lt;br /&gt;
&lt;br /&gt;
=== Основные интерфейсы и классы API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt; - главный интерфейс, который должны реализовывать BE5 компоненты. Поскольку проще всего общаться с frontend посредством пересылки JSON, существуют абстрактные классы, которые упрощают написание таких компонентов:&lt;br /&gt;
** &amp;lt;code&amp;gt;JsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий строку, представляющую собой JSON.&lt;br /&gt;
** &amp;lt;code&amp;gt;NetSfJsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий &amp;lt;code&amp;gt;net.sf.json.JSONObject&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComponentParameters&amp;lt;/code&amp;gt; - всё, что необходимо компоненту. Если необходимо что-то ещё, то либо мы что-то забыли или не предусмотрели (и об этом непременно стоит сообщить нам), либо вы неправильно используете API BeanExplorer5. К чему возможно доступиться из этого компонента:&lt;br /&gt;
** &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; - BE4 проект.&lt;br /&gt;
** &amp;lt;code&amp;gt;Meta&amp;lt;/code&amp;gt; - полезные методы для работы с BE4 проектом.&lt;br /&gt;
** &amp;lt;code&amp;gt;UserService&amp;lt;/code&amp;gt; - работа с сессиями, ролями, выбором языка.&lt;br /&gt;
** &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt; - формирование текстового ответа. Необходимо только для абстрактных компонентов, обеспечивающих обмен текстовыми сообщениями в каком-нибудь формате (JSON, XML и т.п.).&lt;br /&gt;
** &amp;lt;code&amp;gt;HttpServletRequest&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;HttpServletResponse&amp;lt;/code&amp;gt; - предполагается, что в обычной ситуации они не используются. Необходимы только для реализации абстрактных компонентов, обеспечивающих работу с каким-нибудь протоколом на низком уровне. Для обмена текстом достаточно &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Обратите внимание на то, что другие классы не являются частью API, в т.ч. класс Be5 и классы, связанные с реализацией конкретных компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Частью API также являются соглашения о том, какие данные возвращают компоненты, поскольку эти соглашения используются обмена сообщениями между frontend и backend частями компонентов. Исключением являются соглашения о том, какие данные возвращают компоненты &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;form&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Frontend ==&lt;br /&gt;
&amp;lt;big&amp;gt;Компоненты BE5 на frontend - это React.js компоненты.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты подключаются через SystemJS, при этом используется синтаксис ES2015 или метод &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 import Component from 'components/component';&lt;br /&gt;
&lt;br /&gt;
 define([ 'components/component' ], function(Component) {&lt;br /&gt;
   // use(Component)&lt;br /&gt;
   // ...&lt;br /&gt;
   return {};&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Кнопки и ссылки на компоненты (в частности запросы и формы) в BE5 не должны писаться вручную. &lt;br /&gt;
&lt;br /&gt;
Не всё, что находится в проекте be5-frontend, является частью API.&lt;br /&gt;
&lt;br /&gt;
=== Основные части API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; - ядро frontend. Функции, являющиеся частью API:&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.net.request: function(path, params, success, failure)&amp;lt;/code&amp;gt; - делает асинхронный POST запрос к ''вашему'' backend компоненту (&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;componentId/any/path&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.registerAction: function(actionName, fn)&amp;lt;/code&amp;gt; - регистрирует действие, которое будет вызвано при клике по кнопке или ссылке. Вызов действия является следствием смены hash url, при этом адрес разбирается на позиционные и именованные параметры. В зарегистрированную функцию передаются все позиционные параметры, за которыми идёт объект с именованными параметрами. Именованными параметрами считаются части URL, которые содержат символ '=', а позиционными считаются все остальные.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.registerDocumentType: function(type, creator)&amp;lt;/code&amp;gt; - регистрирует новый вид документа. Функция, переданная вторым параметром в &amp;lt;code&amp;gt;registerDocumentType&amp;lt;/code&amp;gt; обычно вызывает &amp;lt;code&amp;gt;React.createElement&amp;lt;/code&amp;gt; и возвращает результат вызова. Результат будет помещён в стандартное для проекта место отображения документа. На данный момент на backend невозможно добавлять свои виды документов, но документ возможно создать посредством вызова &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt; - пересоздаёт документ. В качестве аргумента передаётся объект с двумя полями: &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. Первое указывает тип документа, второе - значение документа, которое интерпретируется обработчиком документа, зарегистрированным посредством вызова &amp;lt;code&amp;gt;be5.ui.registerDocumentType&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Другой способ определения действий ====&lt;br /&gt;
Вы также можете определить действие неявным способом не вызывая &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;. Для этого создаётся файл с именем &amp;lt;code&amp;gt;/actions/yourAction.js&amp;lt;/code&amp;gt;, который определяет AMD модуль посредством метода &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;. Объявдяемым элементом в этом модуле является функция, которая используется так же, как и функция, регистрируемая вызовом &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;, однако при этом подгрузка компонента произойдёт лениво - при первом его использовании.&lt;br /&gt;
&lt;br /&gt;
== REST API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5_API</id>
		<title>BeanExplorer5 API</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5_API"/>
				<updated>2015-11-25T05:46:06Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: Новая страница: «== Backend == &amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Backend ==&lt;br /&gt;
&amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При сборке BeanExplorer5 проекта он воспринимается как OSGi бандл, поэтому у него должен быть манифест &amp;lt;code&amp;gt;META-INF/MANIFEST.MF&amp;lt;/code&amp;gt;. В этом манифесте указывается, от каких бандлов зависит данный бандл. Основные классы API находятся в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;, поэтому его необходимо указать в манифесте.&lt;br /&gt;
&lt;br /&gt;
Помимо этого в структуру BeanExplorer5 проекта входит &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;, в котором возможно объявлять свои компоненты, используя точку расширения &amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt;, которая объявлена в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;. Пример объявления компонента:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;extension point=&amp;quot;com.beanexplorer.be5.component&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;component&lt;br /&gt;
     class=&amp;quot;com.beanexplorer.enterprise.components.Menu&amp;quot;&lt;br /&gt;
     id=&amp;quot;menu&amp;quot;&lt;br /&gt;
     name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указанный класс должен реализовывать интерфейс &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 package com.beanexplorer.enterprise.components;&lt;br /&gt;
 &lt;br /&gt;
 public interface Component {&lt;br /&gt;
   void generate(ComponentParameters parameters);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt; - это единственная точка расширения BeanExplorer5, она позволяет регистрировать свои backend компоненты, которые будут доступны следующим URL:&lt;br /&gt;
&lt;br /&gt;
 //domain/app/main/:componentId&lt;br /&gt;
 //domain/app/main/:componentId/:any/:path&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu/withIds&lt;br /&gt;
&lt;br /&gt;
При запросе к веб-приложению по этим запросам будет создан новый экземпляр компонента и вызван его метод generate. Для того, чтобы узнать путь после имени компонента (&amp;lt;code&amp;gt;:any/:path&amp;lt;/code&amp;gt;), нужно вызвать метод &amp;lt;code&amp;gt;parameters.getRequestUri()&amp;lt;/code&amp;gt;. В случае пустого пути возвращается пустая строка. В случае наличия пути, он возвращается без начального слеша.&lt;br /&gt;
&lt;br /&gt;
=== Основные интерфейсы и классы API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt; - главный интерфейс, который должны реализовывать BE5 компоненты. Поскольку проще всего общаться с frontend посредством пересылки JSON, существуют абстрактные классы, которые упрощают написание таких компонентов:&lt;br /&gt;
** &amp;lt;code&amp;gt;JsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий строку, представляющую собой JSON.&lt;br /&gt;
** &amp;lt;code&amp;gt;NetSfJsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий &amp;lt;code&amp;gt;net.sf.json.JSONObject&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComponentParameters&amp;lt;/code&amp;gt; - всё, что необходимо компоненту. Если необходимо что-то ещё, то либо мы что-то забыли или не предусмотрели, либо вы неправильно используете API BeanExplorer5. К чему возможно доступиться из этого компонента:&lt;br /&gt;
** &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; - BE4 проект.&lt;br /&gt;
** &amp;lt;code&amp;gt;Meta&amp;lt;/code&amp;gt; - полезные методы для работы с BE4 проектом.&lt;br /&gt;
** &amp;lt;code&amp;gt;UserService&amp;lt;/code&amp;gt; - работа с сессиями, ролями, выбором языка.&lt;br /&gt;
** &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt; - формирование текстового ответа. Необходимо только для абстрактных компонентов, обеспечивающих обмен текстовыми сообщениями в каком-нибудь формате (JSON, XML и т.п.).&lt;br /&gt;
** &amp;lt;code&amp;gt;HttpServletRequest&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;HttpServletResponse&amp;lt;/code&amp;gt; - предполагается, что в обычной ситуации они не используются. Необходимы только для реализации абстрактных компонентов, обеспечивающих работу с каким-нибудь протоколом на низком уровне. Для обмена текстом достаточно &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Обратите внимание на то, что другие классы не являются частью API, в т.ч. класс Be5 и классы, связанные с реализацией конкретных компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"/>
				<updated>2015-11-25T04:32:51Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* BeanExplorer5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== BeanExplorer4 ===&lt;br /&gt;
* [[BeanExplorer4]]&lt;br /&gt;
** [[Для разработчиков BE4]]&lt;br /&gt;
* [[Компиляция и запуск BeanExplorer4]]&lt;br /&gt;
* [[Использование ant]]&lt;br /&gt;
* [[Поддержка СУБД]]&lt;br /&gt;
* [[Типы колонок]]&lt;br /&gt;
* [[Структура проекта]]&lt;br /&gt;
* [[Usecases|Usecases с картиночками]]&lt;br /&gt;
* [[JavaScript Debugger]]&lt;br /&gt;
* [[Extras]]&lt;br /&gt;
* [[Entity template|Шаблоны для сущностей]]&lt;br /&gt;
&lt;br /&gt;
=== Freemarker ===&lt;br /&gt;
* [[Freemarker]]&lt;br /&gt;
* [[Встроенные функции]]&lt;br /&gt;
* [[Макросы]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Пользовательские макросы]]&lt;br /&gt;
* [[Создание своих макросов]]&lt;br /&gt;
* [[Built-ins]]&lt;br /&gt;
&lt;br /&gt;
=== BeanExplorer5 ===&lt;br /&gt;
* [[:Category:BeanExplorer5|Категория BeanExplorer5]]&lt;br /&gt;
* [[BeanExplorer5|BeanExplorer5]]&lt;br /&gt;
* [[BeanExplorer5 API|BeanExplorer5 API]]&lt;br /&gt;
* [[BE-SQL|SQL-диалект BeanExplorer5]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Внешние ссылки ===&lt;br /&gt;
* BeanExplorer4 на Edge Wiki [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer4]&lt;br /&gt;
----&lt;br /&gt;
Количество статей в вики: '''[[:Special:Statistics|{{NUMBEROFARTICLES}}]]'''.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"/>
				<updated>2015-11-25T04:32:37Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* BeanExplorer5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== BeanExplorer4 ===&lt;br /&gt;
* [[BeanExplorer4]]&lt;br /&gt;
** [[Для разработчиков BE4]]&lt;br /&gt;
* [[Компиляция и запуск BeanExplorer4]]&lt;br /&gt;
* [[Использование ant]]&lt;br /&gt;
* [[Поддержка СУБД]]&lt;br /&gt;
* [[Типы колонок]]&lt;br /&gt;
* [[Структура проекта]]&lt;br /&gt;
* [[Usecases|Usecases с картиночками]]&lt;br /&gt;
* [[JavaScript Debugger]]&lt;br /&gt;
* [[Extras]]&lt;br /&gt;
* [[Entity template|Шаблоны для сущностей]]&lt;br /&gt;
&lt;br /&gt;
=== Freemarker ===&lt;br /&gt;
* [[Freemarker]]&lt;br /&gt;
* [[Встроенные функции]]&lt;br /&gt;
* [[Макросы]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Пользовательские макросы]]&lt;br /&gt;
* [[Создание своих макросов]]&lt;br /&gt;
* [[Built-ins]]&lt;br /&gt;
&lt;br /&gt;
=== BeanExplorer5 ===&lt;br /&gt;
* [[:Category:BeanExplorer5|Категория BeanExplorer5]]&lt;br /&gt;
* [[BeanExplorer5|BeanExplorer5]]&lt;br /&gt;
* [[BE-SQL|SQL-диалект BeanExplorer5]]&lt;br /&gt;
* [[BeanExplorer5 API|BeanExplorer5 API]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Внешние ссылки ===&lt;br /&gt;
* BeanExplorer4 на Edge Wiki [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer4]&lt;br /&gt;
----&lt;br /&gt;
Количество статей в вики: '''[[:Special:Statistics|{{NUMBEROFARTICLES}}]]'''.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"/>
				<updated>2015-11-25T04:31:34Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* BeanExplorer5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== BeanExplorer4 ===&lt;br /&gt;
* [[BeanExplorer4]]&lt;br /&gt;
** [[Для разработчиков BE4]]&lt;br /&gt;
* [[Компиляция и запуск BeanExplorer4]]&lt;br /&gt;
* [[Использование ant]]&lt;br /&gt;
* [[Поддержка СУБД]]&lt;br /&gt;
* [[Типы колонок]]&lt;br /&gt;
* [[Структура проекта]]&lt;br /&gt;
* [[Usecases|Usecases с картиночками]]&lt;br /&gt;
* [[JavaScript Debugger]]&lt;br /&gt;
* [[Extras]]&lt;br /&gt;
* [[Entity template|Шаблоны для сущностей]]&lt;br /&gt;
&lt;br /&gt;
=== Freemarker ===&lt;br /&gt;
* [[Freemarker]]&lt;br /&gt;
* [[Встроенные функции]]&lt;br /&gt;
* [[Макросы]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Пользовательские макросы]]&lt;br /&gt;
* [[Создание своих макросов]]&lt;br /&gt;
* [[Built-ins]]&lt;br /&gt;
&lt;br /&gt;
=== BeanExplorer5 ===&lt;br /&gt;
* [[:Category:BeanExplorer5|Категория BeanExplorer5]]&lt;br /&gt;
* [[BeanExplorer5|BeanExplorer5]]&lt;br /&gt;
* [[BE-SQL|SQL-диалект BeanExplorer5]]&lt;br /&gt;
* [[Компоненты BeanExplorer5|Компоненты BeanExplorer5]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Внешние ссылки ===&lt;br /&gt;
* BeanExplorer4 на Edge Wiki [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer4]&lt;br /&gt;
----&lt;br /&gt;
Количество статей в вики: '''[[:Special:Statistics|{{NUMBEROFARTICLES}}]]'''.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0</id>
		<title>Сборка BeanExplorer5 проекта</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0"/>
				<updated>2015-11-23T12:14:36Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Для сборки BeanExplorer5 проекта необходимо сначала подготовить BeanExplorer5 для сборки.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Подготовка инструментов ==&lt;br /&gt;
* Необходим Ant. Для установки под Windows необходимо скачать Ant с [http://ant.apache.org/ официального сайта].&lt;br /&gt;
* Необходим NPM. Для установки под Windows необходимо скачать Node.js с [https://nodejs.org/en/ официального сайта]. Мы используем 4 версию.&lt;br /&gt;
* Необходим Gulp. &amp;lt;code&amp;gt;npm install --global gulp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Подготовка BeanExplorer5 ==&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;ant prepareworkspace&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5/be5-frontend&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;, затем &amp;lt;code&amp;gt;gulp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Работа с проектом ==&lt;br /&gt;
* При первой сборке вызывается &amp;lt;code&amp;gt;ant be5.deploy&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* При изменении frontend проекта вызывать &amp;lt;code&amp;gt;ant be5.frontend&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* Не предусмотрено Ant цели для вызова при изменении backend кода.&lt;br /&gt;
* Если вы редактируете &amp;lt;code&amp;gt;be5-frontend&amp;lt;/code&amp;gt;, то необходимо вызвать &amp;lt;code&amp;gt;gulp watch&amp;lt;/code&amp;gt; и ''помимо этого'' после редактирования вызывать &amp;lt;code&amp;gt;ant be5.frontend&amp;lt;/code&amp;gt; из папки BeanExplorer5 проекта.&lt;br /&gt;
&lt;br /&gt;
== При создании проекта ==&lt;br /&gt;
Пример frontend проекта находится в &amp;lt;code&amp;gt;be5/be5-demo&amp;lt;/code&amp;gt;, он содержит пример настройки Gulp для инкрементальной сборки.&lt;br /&gt;
&lt;br /&gt;
Пример объявления целей be5.deploy и be5.frontend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.deploy&amp;quot; depends=&amp;quot;prepare&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;compileapp&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;modules&amp;quot; value=&amp;quot;${MODULES}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;usedatasource&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appencoding&amp;quot; value=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;SRCDIR&amp;quot; value=&amp;quot;${appabsolutepath}/src&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;PROJECT_SOURCE&amp;quot; value=&amp;quot;${PROJECT_SOURCE}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
     &amp;lt;ant antfile=&amp;quot;${COMMONDIR}/makefiles/be_webxml.xml&amp;quot; target=&amp;quot;install_context&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;available property=&amp;quot;tomcat.is.installed&amp;quot; file=&amp;quot;${TOMCAT_HOME}/webapps&amp;quot; type=&amp;quot;dir&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.frontend&amp;quot; depends=&amp;quot;tomcat,check_for_tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;fastfrontend&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0</id>
		<title>Сборка BeanExplorer5 проекта</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0"/>
				<updated>2015-11-23T12:06:37Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Для сборки BeanExplorer5 проекта необходимо сначала подготовить BeanExplorer5 для сборки.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Подготовка BeanExplorer5 ==&lt;br /&gt;
* Необходим Ant. Для установки под Windows необходимо скачать Ant с [http://ant.apache.org/ официального сайта].&lt;br /&gt;
* Необходим NPM. Для установки под Windows необходимо скачать Node.js с [https://nodejs.org/en/ официального сайта]. Мы используем 4 версию.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;ant prepareworkspace&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5/be5-frontend&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;, затем &amp;lt;code&amp;gt;gulp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Работа с проектом ==&lt;br /&gt;
* При первой сборке вызывается &amp;lt;code&amp;gt;ant be5.deploy&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* При изменении frontend проекта вызывать &amp;lt;code&amp;gt;ant be5.frontend&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* Не предусмотрено Ant цели для вызова при изменении backend кода.&lt;br /&gt;
* Если вы редактируете &amp;lt;code&amp;gt;be5-frontend&amp;lt;/code&amp;gt;, то необходимо вызвать &amp;lt;code&amp;gt;gulp watch&amp;lt;/code&amp;gt; и ''помимо этого'' после редактирования вызывать &amp;lt;code&amp;gt;ant be5.frontend&amp;lt;/code&amp;gt; из папки BeanExplorer5 проекта.&lt;br /&gt;
&lt;br /&gt;
== При создании проекта ==&lt;br /&gt;
Пример frontend проекта находится в &amp;lt;code&amp;gt;be5/be5-demo&amp;lt;/code&amp;gt;, он содержит пример настройки Gulp для инкрементальной сборки.&lt;br /&gt;
&lt;br /&gt;
Пример объявления целей be5.deploy и be5.frontend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.deploy&amp;quot; depends=&amp;quot;prepare&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;compileapp&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;modules&amp;quot; value=&amp;quot;${MODULES}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;usedatasource&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appencoding&amp;quot; value=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;SRCDIR&amp;quot; value=&amp;quot;${appabsolutepath}/src&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;PROJECT_SOURCE&amp;quot; value=&amp;quot;${PROJECT_SOURCE}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
     &amp;lt;ant antfile=&amp;quot;${COMMONDIR}/makefiles/be_webxml.xml&amp;quot; target=&amp;quot;install_context&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;available property=&amp;quot;tomcat.is.installed&amp;quot; file=&amp;quot;${TOMCAT_HOME}/webapps&amp;quot; type=&amp;quot;dir&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.frontend&amp;quot; depends=&amp;quot;tomcat,check_for_tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;fastfrontend&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0</id>
		<title>Сборка BeanExplorer5 проекта</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0"/>
				<updated>2015-11-23T12:00:55Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* При создании проекта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Для сборки BeanExplorer5 проекта необходимо сначала подготовить BeanExplorer5 для сборки.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Подготовка BeanExplorer5 ==&lt;br /&gt;
* Необходим Ant. Для установки под Windows необходимо скачать Ant с официального сайта http://ant.apache.org/.&lt;br /&gt;
* Необходим NPM. Для установки под Windows необходимо скачать Node.js с официального сайта https://nodejs.org/en/. Мы используем 4 версию.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;ant prepareworkspace&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5/be5-frontend&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;, затем &amp;lt;code&amp;gt;gulp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Работа с проектом ==&lt;br /&gt;
* При первой сборке вызывается &amp;lt;code&amp;gt;ant be5.deploy&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* При изменении frontend проекта вызывать &amp;lt;code&amp;gt;ant be5.frontend&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* Не предусмотрено Ant цели для вызова при изменении backend кода.&lt;br /&gt;
* Если вы редактируете &amp;lt;code&amp;gt;be5-frontend&amp;lt;/code&amp;gt;, то необходимо вызвать &amp;lt;code&amp;gt;gulp watch&amp;lt;/code&amp;gt; и ''помимо этого'' после редактирования вызывать &amp;lt;code&amp;gt;ant be5.frontend&amp;lt;/code&amp;gt; из папки BeanExplorer5 проекта.&lt;br /&gt;
&lt;br /&gt;
== При создании проекта ==&lt;br /&gt;
Пример frontend проекта находится в &amp;lt;code&amp;gt;be5/be5-demo&amp;lt;/code&amp;gt;, он содержит пример настройки Gulp для инкрементальной сборки.&lt;br /&gt;
&lt;br /&gt;
Пример объявления целей be5.deploy и be5.frontend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.deploy&amp;quot; depends=&amp;quot;prepare&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;compileapp&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;modules&amp;quot; value=&amp;quot;${MODULES}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;usedatasource&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appencoding&amp;quot; value=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;SRCDIR&amp;quot; value=&amp;quot;${appabsolutepath}/src&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;PROJECT_SOURCE&amp;quot; value=&amp;quot;${PROJECT_SOURCE}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
     &amp;lt;ant antfile=&amp;quot;${COMMONDIR}/makefiles/be_webxml.xml&amp;quot; target=&amp;quot;install_context&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;available property=&amp;quot;tomcat.is.installed&amp;quot; file=&amp;quot;${TOMCAT_HOME}/webapps&amp;quot; type=&amp;quot;dir&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.frontend&amp;quot; depends=&amp;quot;tomcat,check_for_tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;fastfrontend&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5</id>
		<title>BeanExplorer5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5"/>
				<updated>2015-11-23T12:00:25Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Это основная статья о BeanExplorer5.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сборка BeanExplorer5==&lt;br /&gt;
См. [[Сборка BeanExplorer5 проекта|Сборка BeanExplorer5 проекта]].&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0</id>
		<title>Сборка BeanExplorer5 проекта</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0"/>
				<updated>2015-11-23T11:59:42Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Работа с проектом */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Для сборки BeanExplorer5 проекта необходимо сначала подготовить BeanExplorer5 для сборки.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Подготовка BeanExplorer5 ==&lt;br /&gt;
* Необходим Ant. Для установки под Windows необходимо скачать Ant с официального сайта http://ant.apache.org/.&lt;br /&gt;
* Необходим NPM. Для установки под Windows необходимо скачать Node.js с официального сайта https://nodejs.org/en/. Мы используем 4 версию.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;ant prepareworkspace&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5/be5-frontend&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;, затем &amp;lt;code&amp;gt;gulp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Работа с проектом ==&lt;br /&gt;
* При первой сборке вызывается &amp;lt;code&amp;gt;ant be5.deploy&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* При изменении frontend проекта вызывать &amp;lt;code&amp;gt;ant be5.frontend&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* Не предусмотрено Ant цели для вызова при изменении backend кода.&lt;br /&gt;
* Если вы редактируете &amp;lt;code&amp;gt;be5-frontend&amp;lt;/code&amp;gt;, то необходимо вызвать &amp;lt;code&amp;gt;gulp watch&amp;lt;/code&amp;gt; и ''помимо этого'' после редактирования вызывать &amp;lt;code&amp;gt;ant be5.frontend&amp;lt;/code&amp;gt; из папки BeanExplorer5 проекта.&lt;br /&gt;
&lt;br /&gt;
== При создании проекта ==&lt;br /&gt;
Пример frontend проекта находится в &amp;lt;code&amp;gt;be5/be5-demo&amp;lt;/code&amp;gt;, он содержит пример настройки Gulp для инкрементальной сборки.&lt;br /&gt;
&lt;br /&gt;
Примеры объявления целей be5.deploy и be5.frontend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.deploy&amp;quot; depends=&amp;quot;prepare&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;compileapp&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;modules&amp;quot; value=&amp;quot;${MODULES}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;usedatasource&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appencoding&amp;quot; value=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;SRCDIR&amp;quot; value=&amp;quot;${appabsolutepath}/src&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;PROJECT_SOURCE&amp;quot; value=&amp;quot;${PROJECT_SOURCE}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
     &amp;lt;ant antfile=&amp;quot;${COMMONDIR}/makefiles/be_webxml.xml&amp;quot; target=&amp;quot;install_context&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;available property=&amp;quot;tomcat.is.installed&amp;quot; file=&amp;quot;${TOMCAT_HOME}/webapps&amp;quot; type=&amp;quot;dir&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.frontend&amp;quot; depends=&amp;quot;tomcat,check_for_tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;fastfrontend&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0</id>
		<title>Сборка BeanExplorer5 проекта</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0"/>
				<updated>2015-11-23T11:57:46Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* При создании проекта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Для сборки BeanExplorer5 проекта необходимо сначала подготовить BeanExplorer5 для сборки.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Подготовка BeanExplorer5 ==&lt;br /&gt;
* Необходим Ant. Для установки под Windows необходимо скачать Ant с официального сайта http://ant.apache.org/.&lt;br /&gt;
* Необходим NPM. Для установки под Windows необходимо скачать Node.js с официального сайта https://nodejs.org/en/. Мы используем 4 версию.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;ant prepareworkspace&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5/be5-frontend&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;, затем &amp;lt;code&amp;gt;gulp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Работа с проектом ==&lt;br /&gt;
* При первой сборке вызывается &amp;lt;code&amp;gt;ant be5.deploy&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* При изменении frontend проекта вызывать &amp;lt;code&amp;gt;ant be5.frontend&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* Не предусмотрено Ant цели для вызова при изменении backend кода.&lt;br /&gt;
&lt;br /&gt;
== При создании проекта ==&lt;br /&gt;
Пример frontend проекта находится в &amp;lt;code&amp;gt;be5/be5-demo&amp;lt;/code&amp;gt;, он содержит пример настройки Gulp для инкрементальной сборки.&lt;br /&gt;
&lt;br /&gt;
Примеры объявления целей be5.deploy и be5.frontend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.deploy&amp;quot; depends=&amp;quot;prepare&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;compileapp&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;modules&amp;quot; value=&amp;quot;${MODULES}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;usedatasource&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appencoding&amp;quot; value=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;SRCDIR&amp;quot; value=&amp;quot;${appabsolutepath}/src&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;PROJECT_SOURCE&amp;quot; value=&amp;quot;${PROJECT_SOURCE}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
     &amp;lt;ant antfile=&amp;quot;${COMMONDIR}/makefiles/be_webxml.xml&amp;quot; target=&amp;quot;install_context&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;available property=&amp;quot;tomcat.is.installed&amp;quot; file=&amp;quot;${TOMCAT_HOME}/webapps&amp;quot; type=&amp;quot;dir&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.frontend&amp;quot; depends=&amp;quot;tomcat,check_for_tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;fastfrontend&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0</id>
		<title>Сборка BeanExplorer5 проекта</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0"/>
				<updated>2015-11-23T11:56:54Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: Новая страница: «&amp;lt;big&amp;gt;Для сборки BeanExplorer5 проекта необходимо сначала подготовить BeanExplorer5 для сборки.&amp;lt;/big&amp;gt;  == По…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Для сборки BeanExplorer5 проекта необходимо сначала подготовить BeanExplorer5 для сборки.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Подготовка BeanExplorer5 ==&lt;br /&gt;
* Необходим Ant. Для установки под Windows необходимо скачать Ant с официального сайта http://ant.apache.org/.&lt;br /&gt;
* Необходим NPM. Для установки под Windows необходимо скачать Node.js с официального сайта https://nodejs.org/en/. Мы используем 4 версию.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;ant prepareworkspace&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5/be5-frontend&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;, затем &amp;lt;code&amp;gt;gulp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Работа с проектом ==&lt;br /&gt;
* При первой сборке вызывается &amp;lt;code&amp;gt;ant be5.deploy&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* При изменении frontend проекта вызывать &amp;lt;code&amp;gt;ant be5.frontend&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* Не предусмотрено Ant цели для вызова при изменении backend кода.&lt;br /&gt;
&lt;br /&gt;
== При создании проекта ==&lt;br /&gt;
Пример frontend проекта находится в &amp;lt;code&amp;gt;be5/be5-demo&amp;lt;/code&amp;gt; с примером настройки Gulp для инкрементальной сборки этого проекта.&lt;br /&gt;
&lt;br /&gt;
Примеры объявления целей be5.deploy и be5.frontend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.deploy&amp;quot; depends=&amp;quot;prepare&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;compileapp&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;modules&amp;quot; value=&amp;quot;${MODULES}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;usedatasource&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appencoding&amp;quot; value=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;SRCDIR&amp;quot; value=&amp;quot;${appabsolutepath}/src&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;PROJECT_SOURCE&amp;quot; value=&amp;quot;${PROJECT_SOURCE}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
     &amp;lt;ant antfile=&amp;quot;${COMMONDIR}/makefiles/be_webxml.xml&amp;quot; target=&amp;quot;install_context&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;available property=&amp;quot;tomcat.is.installed&amp;quot; file=&amp;quot;${TOMCAT_HOME}/webapps&amp;quot; type=&amp;quot;dir&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.frontend&amp;quot; depends=&amp;quot;tomcat,check_for_tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;fastfrontend&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5</id>
		<title>BeanExplorer5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5"/>
				<updated>2015-11-23T11:33:05Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Это основная статья о BeanExplorer5.&lt;br /&gt;
&lt;br /&gt;
==Сборка BeanExplorer5==&lt;br /&gt;
См. [[Сборка BeanExplorer5 проекта|Сборка BeanExplorer5 проекта]].&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5</id>
		<title>BeanExplorer5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5"/>
				<updated>2015-11-23T11:32:35Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: Новая страница: «==Сборка BeanExplorer5== См. Сборка BeanExplorer5 проекта.  Category:BeanExplorer5»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Сборка BeanExplorer5==&lt;br /&gt;
См. [[Сборка BeanExplorer5 проекта|Сборка BeanExplorer5 проекта]].&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"/>
				<updated>2015-11-23T11:29:09Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* BeanExplorer5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== BeanExplorer4 ===&lt;br /&gt;
* [[BeanExplorer4]]&lt;br /&gt;
** [[Для разработчиков BE4]]&lt;br /&gt;
* [[Компиляция и запуск BeanExplorer4]]&lt;br /&gt;
* [[Использование ant]]&lt;br /&gt;
* [[Поддержка СУБД]]&lt;br /&gt;
* [[Типы колонок]]&lt;br /&gt;
* [[Структура проекта]]&lt;br /&gt;
* [[Usecases|Usecases с картиночками]]&lt;br /&gt;
* [[JavaScript Debugger]]&lt;br /&gt;
* [[Extras]]&lt;br /&gt;
* [[Entity template|Шаблоны для сущностей]]&lt;br /&gt;
&lt;br /&gt;
=== Freemarker ===&lt;br /&gt;
* [[Freemarker]]&lt;br /&gt;
* [[Встроенные функции]]&lt;br /&gt;
* [[Макросы]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Пользовательские макросы]]&lt;br /&gt;
* [[Создание своих макросов]]&lt;br /&gt;
* [[Built-ins]]&lt;br /&gt;
&lt;br /&gt;
=== BeanExplorer5 ===&lt;br /&gt;
* [[:Category:BeanExplorer5|Категория BeanExplorer5]]&lt;br /&gt;
* [[BeanExplorer5|BeanExplorer5]]&lt;br /&gt;
* [[BE-SQL|SQL-диалект BeanExplorer5]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Внешние ссылки ===&lt;br /&gt;
* BeanExplorer4 на Edge Wiki [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer4]&lt;br /&gt;
----&lt;br /&gt;
Количество статей в вики: '''[[:Special:Statistics|{{NUMBEROFARTICLES}}]]'''.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"/>
				<updated>2015-11-23T11:26:56Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* BeanExplorer5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== BeanExplorer4 ===&lt;br /&gt;
* [[BeanExplorer4]]&lt;br /&gt;
** [[Для разработчиков BE4]]&lt;br /&gt;
* [[Компиляция и запуск BeanExplorer4]]&lt;br /&gt;
* [[Использование ant]]&lt;br /&gt;
* [[Поддержка СУБД]]&lt;br /&gt;
* [[Типы колонок]]&lt;br /&gt;
* [[Структура проекта]]&lt;br /&gt;
* [[Usecases|Usecases с картиночками]]&lt;br /&gt;
* [[JavaScript Debugger]]&lt;br /&gt;
* [[Extras]]&lt;br /&gt;
* [[Entity template|Шаблоны для сущностей]]&lt;br /&gt;
&lt;br /&gt;
=== Freemarker ===&lt;br /&gt;
* [[Freemarker]]&lt;br /&gt;
* [[Встроенные функции]]&lt;br /&gt;
* [[Макросы]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Пользовательские макросы]]&lt;br /&gt;
* [[Создание своих макросов]]&lt;br /&gt;
* [[Built-ins]]&lt;br /&gt;
&lt;br /&gt;
=== BeanExplorer5 ===&lt;br /&gt;
* [[BE-SQL|SQL-диалект BeanExplorer5]]&lt;br /&gt;
* [[:Category:BeanExplorer5|BeanExplorer5]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Внешние ссылки ===&lt;br /&gt;
* BeanExplorer4 на Edge Wiki [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer4]&lt;br /&gt;
----&lt;br /&gt;
Количество статей в вики: '''[[:Special:Statistics|{{NUMBEROFARTICLES}}]]'''.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"/>
				<updated>2015-11-23T11:25:40Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* BeanExplorer5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== BeanExplorer4 ===&lt;br /&gt;
* [[BeanExplorer4]]&lt;br /&gt;
** [[Для разработчиков BE4]]&lt;br /&gt;
* [[Компиляция и запуск BeanExplorer4]]&lt;br /&gt;
* [[Использование ant]]&lt;br /&gt;
* [[Поддержка СУБД]]&lt;br /&gt;
* [[Типы колонок]]&lt;br /&gt;
* [[Структура проекта]]&lt;br /&gt;
* [[Usecases|Usecases с картиночками]]&lt;br /&gt;
* [[JavaScript Debugger]]&lt;br /&gt;
* [[Extras]]&lt;br /&gt;
* [[Entity template|Шаблоны для сущностей]]&lt;br /&gt;
&lt;br /&gt;
=== Freemarker ===&lt;br /&gt;
* [[Freemarker]]&lt;br /&gt;
* [[Встроенные функции]]&lt;br /&gt;
* [[Макросы]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Пользовательские макросы]]&lt;br /&gt;
* [[Создание своих макросов]]&lt;br /&gt;
* [[Built-ins]]&lt;br /&gt;
&lt;br /&gt;
=== BeanExplorer5 ===&lt;br /&gt;
* [[BE-SQL|SQL-диалект BeanExplorer5]]&lt;br /&gt;
* [[BeanExplorer5|BeanExplorer5]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Внешние ссылки ===&lt;br /&gt;
* BeanExplorer4 на Edge Wiki [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer4]&lt;br /&gt;
----&lt;br /&gt;
Количество статей в вики: '''[[:Special:Statistics|{{NUMBEROFARTICLES}}]]'''.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer4</id>
		<title>BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer4"/>
				<updated>2015-11-13T05:37:42Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Как настроить Tomcat для возможности подгрузить изменения в class-файлах. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Как начать работу с BeanExplorer 4 ==&lt;br /&gt;
Для установки: смотрите «[[Компиляция и запуск BeanExplorer4|компиляция и запуск]]».&lt;br /&gt;
&lt;br /&gt;
Есть три способа начать работать с проектом BeanExplorer 4.&lt;br /&gt;
# Взять готовый проект. В таком случае просто откройте перспективу BeanExplorer, сделайте импорт проекта обычным способом, а затем кликните на проект или project.yaml правой кнопкой мыши (во view Project Explorer) и выберите &amp;quot;BeanExplorer -&amp;gt; Open BeanExplorer Project&amp;quot;. Проект появится во view с названием Model.&lt;br /&gt;
# Преобразовать старый BeanExplorer-проект. Для этого выберите File-&amp;gt;New-&amp;gt;Project..., BeanExplorer-&amp;gt;New BeanExplorer Project Using Database Connection (более короткий способ это сделать - это выбрать пункт меню BeanExplorer-&amp;gt;Quick Load Using Database Connection, если уже есть профиль для подключения к базе данных). Если нет ни одного профиля для подключения к СУБД, его надо создать, нажав &amp;quot;Create a new connection profile&amp;quot; и введя всю необходимую информацию для подключения, а также выбрав JDBC драйвер. Пароль обязательно сохранить. Можно это [[BeanExplorer4#Как создать новый профиль подключения к БД|сделать до начала создания проекта, обычными средставми Eclipse DTP]]. После нажатия на кнопку &amp;quot;Finish&amp;quot; загруженный проект должен отобразиться во view &amp;quot;Model&amp;quot;. Преобразование может быть неточным и придётся его доделывать вручную. Кроме того, не сохранятся никакие M4 макросы.&lt;br /&gt;
# Создать новый проект.&lt;br /&gt;
#* File -&amp;gt; New -&amp;gt; Project...&lt;br /&gt;
#* BeanExplorer -&amp;gt; BeanExplorer Project, Next&lt;br /&gt;
#* Ввести имя проекта, изначальный список ролей, допустимых в проекте, и набор поддерживаемых языков (роли и языки всегда можно будет добавить ещё).&lt;br /&gt;
#* Выбрать набор используемых модулей и фитч. Модули аналогичны самим BeanExplorer4 проектам. Модуль 'beanexplorer' всегда добавляется в проект безусловно, поэтому его нельзя выбрать самому.&lt;br /&gt;
#* Заполнить параметры подключения к базе данных. У нас в проектах всегда используются connection profiles и Eclipse DTP, поэтому для начала работы с BeanExplorer4 сначала необходимо создать базу данных и connection profile для её использования. Тестовый пользователь - одновременно и администратор базы данных и пользователь-администратор из создаваемого BeanExplorer4 приложения.&lt;br /&gt;
# Создать новый проект возможно и из консоли. Для этого запускается Ant target с именем 'wizard' (зайти в консоли в папку 'be4/src' и напечатать 'ant wizard', если у вас установлен Ant).&lt;br /&gt;
&lt;br /&gt;
== Описание по каждому редактору и view ==&lt;br /&gt;
* Model (view). Дерево проекта.&lt;br /&gt;
* Properties (view). Свойства выделенного в дереве проекта элемента.&lt;br /&gt;
* Documentation (view). Документация к выделенному в дереве проекта элементу.&lt;br /&gt;
* Tasks (view). Отображает все маркеры @todo и @check, найденные в документации ко всем элементам проекта и при необходимости скачивает задачи с ERP или Bugzilla. Для того, чтобы связать открытый проект с ERP, необходимо в его свойствах (Properties view!) заполнить поле 'ERP project identifier'. Аналогично для связи с Bugzilla имеется поле 'Bugzilla product name'. Помимо этих полей потребуеются логин и пароль, которые возможно ввести на странице BeanExplorer в настройках (Window-&amp;gt;Preferences) (если они не введены, при попытке подключиться к ERP или Bugzilla BeanExplorer4 предложит вам ввести их в диалоговом окошке). Для того, чтобы связать какое-нибудь задание из документации с багом в Bugzilla или ERP, в начале его текста нужно указать номер бага с префиксом 'bug' или 'erp' соответственно: например, в тексте документации будет &amp;quot;@todo bug12345 исправить систему подсчёта X&amp;quot;.&lt;br /&gt;
* Security (view). Таблица с правами ролей для каждого запроса и каждой операции. Реагирует на то, какой редактор открыт или какой элемент в дереве проектов выбран, и в соответствии с последним выбранным элементов фильтрует таблицу. Если в дереве проектов выбран модуль, то будут отображаться только операции и запросы из этого модуля, если entity, то отображаются только те операции и запросы, что относятся к данной entity. Фильтр по ролям позволяет выбрать все операции и запросы, которые может выполнять выбранная роль.&lt;br /&gt;
* Diagram (editor). Редактор диаграмм. Позволяет открывать .dml файлы и редактировать несколько их видов. Диаграммы каждого вида возможно создать пустыми выбором соответствующего пункта в основном меню BeanExplorer (BeanExplorer-&amp;gt;Create *** Diagram/Board). Поддерживаемые виды диаграмм:&lt;br /&gt;
** ER модели. Могут быть открыты посредством клика на модуль и выбора &amp;quot;Create Diagram From This Module&amp;quot;.&lt;br /&gt;
** EPC (Event-Process Chain) диаграммы.&lt;br /&gt;
** CFF (Cross-Functional Flowchart) диаграммы.&lt;br /&gt;
** Planning boards - доски с задачами.&lt;br /&gt;
* Diagram Layout (view). Позволяет перераспределить элементы ER диаграмы. Всегда относится к диаграмме из редактора ER, которым пользовались последним.&lt;br /&gt;
* SQL Editor (editor). Позволяет редактировать SQL запросы - открывается при клике на запросы в дереве проекта. Почти то же самое, что и SQL редактор из Eclipse DTP. Позволяет запускать SQL запросы (правый щелчок мышью-&amp;gt;Execute All). Отличается от оригинального тем, что, во-первых, не сохраняет изменения в файл (при попытке сохранить изменения окажутся в модели BeanExplorer 4), а, во-вторых, позволяет запускать SQL с учётом макропроцессора FreeMarker и [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer/beanexplorerdocrus плейсхолдеров BeanExplorer] (правый щелчок мышью-&amp;gt;Run или &amp;quot;Run BeanExplorer SQL Query&amp;quot; на toolbar'е).&lt;br /&gt;
* Query Executor (view).&lt;br /&gt;
** Позволяет определить контекст выполнения SQL запроса - посредством выбора своих параметров запроса или сессии (при этом запрос пока выполняется только под администратором).&lt;br /&gt;
** Позволяет посмотреть результаты запуска SQL запроса. Автоматически активируется при SQL запросе. Позволяет посмотреть результаты запроса как в виде простой таблицы, так и в виде HTML после обработки в BeanExplorer, а также посмотреть обработанные представления запроса — после макропроцессора FreeMarker и в чистом SQL виде.&lt;br /&gt;
* JavaScript Editor (editor). Позволяет редактировать JavaScript скрипты - открывается при клике на JavaScript/server операции в дереве проекта. Почти то же самое, что и обычный JavaScript редактор из Eclipse JSDT. Отличается тем, что позволяет запускать Rhino JavaScript (&amp;quot;Run JavaScript&amp;quot; на toolbar'е или &amp;quot;Execute&amp;quot; в Operation Parameters view). Результат вызова операции открывается в браузере.&lt;br /&gt;
* Operation Parameters (view). Позволяет определить контекст выполнения JavaScript/server операции посредством задания параметров и выбранных строчек. Также позволяет выбрать метод для запуска: getParameters(), invoke() или getRedirectURL() (последний пока не поддерживается).&lt;br /&gt;
* Localization (view). [[Localizations|Локализация]], относящаяся к выделенному в дереве проектов элементу. Отображается при выборе entity, operation или query.&lt;br /&gt;
&lt;br /&gt;
== Основная информация для понимания BeanExplorer 4 ==&lt;br /&gt;
# Основное представление проекта BeanExplorer 4 - это не база данных, не YAML проект, а дерево проекта в Model view. При открытии BeanExplorer 4 проекта, он оказывается в Model view. И только при сохранении он сериализуется в YAML&lt;br /&gt;
# Основные простейшие действия с проектом - создание/удаление сущностей (entities), операций (operation) и запросов (query) - делаются из контекстного меню (pop-up) в Model view.&lt;br /&gt;
# Если с каким-нибудь узлом дерева проекта может быть связан редактор, то при выделении этого узла открывается редактор. Например, для JavaScript/server операции открывается JavaScript редактор, для 1D запроса - SQL редактор, для custom step - текстовый редактор, для Java операции открывается Java редактор (если .java файл с соответствующим именем находится в рабочем пространстве Eclipse). Некоторые редакторы при сохранении никак не меняют файлы - файлы будут изменены только при сохранении проекта.&lt;br /&gt;
# У большинство элементов из дерева проекта есть свойства, которые возможно редактировать в Properties view.&lt;br /&gt;
# Для любого подключения к базе данных необходим connection profile ([http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.datatools.connectivity.doc.user%2Fdoc%2Fhtml%2Fasc1229700343352.html в документации по Kepler]). При импорте готового проекта connection profile создаётся автоматически, однако вручную всё же необходимо выбрать к нему JDBC Connector (если СУБД для подключения используется впервые). Connection Profile необходим как для SQL запросов из обычного SQL редактора Eclipse DTP, так и для запросов BeanExplorer. Настройки connection profiles находятся в разделе проекта &amp;quot;Connection profiles&amp;quot;, в &amp;quot;папочках&amp;quot; Local и Remote. Эти настройки сохраняются в XML при сохранении BeanExplorer 4 проекта, а при его открытии воссоздаются, и если Eclipse DTP не имеет connection profiles с соответствующими именами, то они будут созданы. Конкретнее - эти настройки хранятся в двух файлах: connectionProfiles.local.xml и connectionProfiles.remote.xml, причём предполагается, что .local вписан в .gitignore, а .remote - нет. Для возможности подключиться к базе данных всегда должен быть выбран в качестве текущего какой-нибудь connection profile. Выбирается он в свойствах проекта (Properties view, &amp;quot;Connection profile name&amp;quot;) - в соответствующем combo box отображаются только те профили, которые есть в Local или Remote. Добавить новый connection profile в проект BeanExplorer 4 возможно через контекстное меню (для этого его сначала необходимо создать в Data Source Explorer view (из Eclipse DTP)).&lt;br /&gt;
&lt;br /&gt;
== Работа с BeanExplorer 4 для аналитиков ==&lt;br /&gt;
Для некоторых типов элементов из дерева проектов возможно приписывать комментарии/документацию. На данный момент это следующие типы элементов:&lt;br /&gt;
* проект,&lt;br /&gt;
* модули (в т.ч. application),&lt;br /&gt;
* сущности (entities - всё, что находится внутри модуля в папках Collections, Dictionaries, Tables, Generic Collections, Metadata),&lt;br /&gt;
* операции,&lt;br /&gt;
* запросы.&lt;br /&gt;
Документация отображается в Documentation view. Если в документации элемента есть маркер @todo или @check, то строка с этим маркером окажется и в другом view: Tasks. При клике на какую-либо строчку из Tasks будет выделен соответствующий ей элемент в Model view.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Analyst1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Возможности назначения ролей ===&lt;br /&gt;
* Все роли перечислены в свойствах проекта. При клике на список ролей (&amp;quot;Project roles&amp;quot; в Properties view при выбранно проекте) появляется панель, позволяющая добавлять роли.&lt;br /&gt;
* Для операций и запросов роли назначаются во view Security.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Analyst2.png]]&lt;br /&gt;
&lt;br /&gt;
== Usecases ==&lt;br /&gt;
Перенесены [[Usecases|сюда]].&lt;br /&gt;
&lt;br /&gt;
== Компиляция и запуск Eclipse с плагином BeanExplorer4 ==&lt;br /&gt;
Здесь: [[Компиляция и запуск BeanExplorer4]] (инструкции для тех, кто запускает Eclipse BeanExplorer4 из под другого экземпляра Eclipse).&lt;br /&gt;
&lt;br /&gt;
== Структура проекта BeanExplorer 4 ==&lt;br /&gt;
[[Структура проекта|Структура]] проекта BeanExplorer 4&lt;br /&gt;
&lt;br /&gt;
== Процесс разработки ==&lt;br /&gt;
=== Использование Ant ===&lt;br /&gt;
[[Использование ant|Использование Ant]]&lt;br /&gt;
&lt;br /&gt;
=== Использование шаблонов Freemarker ===&lt;br /&gt;
Использование шаблонов [[Freemarker|Freemarker]]&lt;br /&gt;
&lt;br /&gt;
=== JavaScript Debugger ===&lt;br /&gt;
Текущее состояние [[JavaScript Debugger|JavaScript Debugger]]&lt;br /&gt;
&lt;br /&gt;
=== Поддержка СУБД ===&lt;br /&gt;
Поддержка [[Поддержка СУБД|различных СУБД]]&lt;br /&gt;
&lt;br /&gt;
== Полезная информация, которая может помочь при работе с BeanExplorer 4 ==&lt;br /&gt;
=== Как устанавливать плагины/фитчи из архива ===&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки. Это может занять продолжительное время, т.к. с основного репозитория Eclipse будут скачиваться недостающие плагины.&lt;br /&gt;
&lt;br /&gt;
=== Где взять редактор YAML ===&lt;br /&gt;
Update site: &amp;lt;code&amp;gt;http://dadacoalition.org/yedit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Site: [https://code.google.com/p/yedit/ https://code.google.com/p/yedit/])&lt;br /&gt;
&lt;br /&gt;
=== Где взять редактор FreeMarker ===&lt;br /&gt;
Update site: &amp;lt;code&amp;gt;http://download.jboss.org/jbosstools/updates/stable/kepler/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или:&lt;br /&gt;
&lt;br /&gt;
Help-&amp;gt;Eclipse Marketplace... ищем &amp;quot;JBoss Tools&amp;quot;, жмём Install у JBoss Tools (Kepler), снимаем галочку со всего и выбираем JBoss Tools (Kepler)-&amp;gt;FreeMarker IDE.&lt;br /&gt;
&lt;br /&gt;
=== Как настроить Tomcat для возможности подгрузить изменения в class-файлах. ===&lt;br /&gt;
1. Add the following lines into /conf/tomcat-users.xml (inside the root element &amp;lt;tomcat-users&amp;gt;):&lt;br /&gt;
 &amp;lt;role rolename=&amp;quot;manager-script&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;user username=&amp;quot;tomcat&amp;quot; password=&amp;quot;tomcat&amp;quot; roles=&amp;quot;manager-script&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Create /conf/Catalina/localhost/manager.xml with the following content:&lt;br /&gt;
 &amp;lt;Context privileged=&amp;quot;true&amp;quot; antiResourceLocking=&amp;quot;false&amp;quot;&lt;br /&gt;
          docBase=&amp;quot;${catalina.home}/webapps/manager&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Valve className=&amp;quot;org.apache.catalina.valves.RemoteAddrValve&amp;quot;&lt;br /&gt;
         allow=&amp;quot;127\.0\.0\.1&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/Context&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробнее [http://tomcat.apache.org/tomcat-7.0-doc/manager-howto.html здесь] и [http://www.mulesoft.com/tcat/tomcat-reload здесь].&lt;br /&gt;
&lt;br /&gt;
3. You can change the username or the password, but you should ensure that your connection profile uses these username and password. Beside this you can change the URL that will be called to refresh Tomcat. Note that this action uses the Tomcat application name from the connection profile. Tomcat path should be set too.&lt;br /&gt;
&lt;br /&gt;
=== Как создать новый профиль подключения к БД ===&lt;br /&gt;
* Переключиться в перспективу Database Development. (В Eclipse почти в правом верхнем углу нажать квадратную кнопку с плюсиком &amp;quot;Open Perspective&amp;quot; и выбрать там &amp;quot;Database Development&amp;quot;).&lt;br /&gt;
* Во view Data Source Explorer кликнуть правой кнопкой мыши на Database Connections, New....&lt;br /&gt;
* Выбрать в диалоговом окне тип используемой БД (напр., PostgreSQL), ввести нормальное имя для подключения (например, &amp;quot;condo&amp;quot;), Next.&lt;br /&gt;
* Ввести параметры подключения, их можно узнать у администратора БД. При первом создании профиля подключения с данным типом СУБД необходимо выбрать драйвер СУБД (для этого нажать круглишок с плюсиком у combo &amp;quot;Driver&amp;quot;, а в появившемся диалоге на второй вкладке обычно необходимо удалить выбранный драйвер и выбрать свой - мы для удобство поместили все драйвера в папку lib из be4).&lt;br /&gt;
* Next, Finish.&lt;br /&gt;
* Новый профиль появится в списке Database Connections во view Data Source Explorer.&lt;br /&gt;
&lt;br /&gt;
= Для разработчиков =&lt;br /&gt;
[[Для разработчиков BE4|Сюда]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer4</id>
		<title>BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer4"/>
				<updated>2015-11-13T05:36:45Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Как настроить Tomcat для возможности подгрузить изменения в class-файлах. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Как начать работу с BeanExplorer 4 ==&lt;br /&gt;
Для установки: смотрите «[[Компиляция и запуск BeanExplorer4|компиляция и запуск]]».&lt;br /&gt;
&lt;br /&gt;
Есть три способа начать работать с проектом BeanExplorer 4.&lt;br /&gt;
# Взять готовый проект. В таком случае просто откройте перспективу BeanExplorer, сделайте импорт проекта обычным способом, а затем кликните на проект или project.yaml правой кнопкой мыши (во view Project Explorer) и выберите &amp;quot;BeanExplorer -&amp;gt; Open BeanExplorer Project&amp;quot;. Проект появится во view с названием Model.&lt;br /&gt;
# Преобразовать старый BeanExplorer-проект. Для этого выберите File-&amp;gt;New-&amp;gt;Project..., BeanExplorer-&amp;gt;New BeanExplorer Project Using Database Connection (более короткий способ это сделать - это выбрать пункт меню BeanExplorer-&amp;gt;Quick Load Using Database Connection, если уже есть профиль для подключения к базе данных). Если нет ни одного профиля для подключения к СУБД, его надо создать, нажав &amp;quot;Create a new connection profile&amp;quot; и введя всю необходимую информацию для подключения, а также выбрав JDBC драйвер. Пароль обязательно сохранить. Можно это [[BeanExplorer4#Как создать новый профиль подключения к БД|сделать до начала создания проекта, обычными средставми Eclipse DTP]]. После нажатия на кнопку &amp;quot;Finish&amp;quot; загруженный проект должен отобразиться во view &amp;quot;Model&amp;quot;. Преобразование может быть неточным и придётся его доделывать вручную. Кроме того, не сохранятся никакие M4 макросы.&lt;br /&gt;
# Создать новый проект.&lt;br /&gt;
#* File -&amp;gt; New -&amp;gt; Project...&lt;br /&gt;
#* BeanExplorer -&amp;gt; BeanExplorer Project, Next&lt;br /&gt;
#* Ввести имя проекта, изначальный список ролей, допустимых в проекте, и набор поддерживаемых языков (роли и языки всегда можно будет добавить ещё).&lt;br /&gt;
#* Выбрать набор используемых модулей и фитч. Модули аналогичны самим BeanExplorer4 проектам. Модуль 'beanexplorer' всегда добавляется в проект безусловно, поэтому его нельзя выбрать самому.&lt;br /&gt;
#* Заполнить параметры подключения к базе данных. У нас в проектах всегда используются connection profiles и Eclipse DTP, поэтому для начала работы с BeanExplorer4 сначала необходимо создать базу данных и connection profile для её использования. Тестовый пользователь - одновременно и администратор базы данных и пользователь-администратор из создаваемого BeanExplorer4 приложения.&lt;br /&gt;
# Создать новый проект возможно и из консоли. Для этого запускается Ant target с именем 'wizard' (зайти в консоли в папку 'be4/src' и напечатать 'ant wizard', если у вас установлен Ant).&lt;br /&gt;
&lt;br /&gt;
== Описание по каждому редактору и view ==&lt;br /&gt;
* Model (view). Дерево проекта.&lt;br /&gt;
* Properties (view). Свойства выделенного в дереве проекта элемента.&lt;br /&gt;
* Documentation (view). Документация к выделенному в дереве проекта элементу.&lt;br /&gt;
* Tasks (view). Отображает все маркеры @todo и @check, найденные в документации ко всем элементам проекта и при необходимости скачивает задачи с ERP или Bugzilla. Для того, чтобы связать открытый проект с ERP, необходимо в его свойствах (Properties view!) заполнить поле 'ERP project identifier'. Аналогично для связи с Bugzilla имеется поле 'Bugzilla product name'. Помимо этих полей потребуеются логин и пароль, которые возможно ввести на странице BeanExplorer в настройках (Window-&amp;gt;Preferences) (если они не введены, при попытке подключиться к ERP или Bugzilla BeanExplorer4 предложит вам ввести их в диалоговом окошке). Для того, чтобы связать какое-нибудь задание из документации с багом в Bugzilla или ERP, в начале его текста нужно указать номер бага с префиксом 'bug' или 'erp' соответственно: например, в тексте документации будет &amp;quot;@todo bug12345 исправить систему подсчёта X&amp;quot;.&lt;br /&gt;
* Security (view). Таблица с правами ролей для каждого запроса и каждой операции. Реагирует на то, какой редактор открыт или какой элемент в дереве проектов выбран, и в соответствии с последним выбранным элементов фильтрует таблицу. Если в дереве проектов выбран модуль, то будут отображаться только операции и запросы из этого модуля, если entity, то отображаются только те операции и запросы, что относятся к данной entity. Фильтр по ролям позволяет выбрать все операции и запросы, которые может выполнять выбранная роль.&lt;br /&gt;
* Diagram (editor). Редактор диаграмм. Позволяет открывать .dml файлы и редактировать несколько их видов. Диаграммы каждого вида возможно создать пустыми выбором соответствующего пункта в основном меню BeanExplorer (BeanExplorer-&amp;gt;Create *** Diagram/Board). Поддерживаемые виды диаграмм:&lt;br /&gt;
** ER модели. Могут быть открыты посредством клика на модуль и выбора &amp;quot;Create Diagram From This Module&amp;quot;.&lt;br /&gt;
** EPC (Event-Process Chain) диаграммы.&lt;br /&gt;
** CFF (Cross-Functional Flowchart) диаграммы.&lt;br /&gt;
** Planning boards - доски с задачами.&lt;br /&gt;
* Diagram Layout (view). Позволяет перераспределить элементы ER диаграмы. Всегда относится к диаграмме из редактора ER, которым пользовались последним.&lt;br /&gt;
* SQL Editor (editor). Позволяет редактировать SQL запросы - открывается при клике на запросы в дереве проекта. Почти то же самое, что и SQL редактор из Eclipse DTP. Позволяет запускать SQL запросы (правый щелчок мышью-&amp;gt;Execute All). Отличается от оригинального тем, что, во-первых, не сохраняет изменения в файл (при попытке сохранить изменения окажутся в модели BeanExplorer 4), а, во-вторых, позволяет запускать SQL с учётом макропроцессора FreeMarker и [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer/beanexplorerdocrus плейсхолдеров BeanExplorer] (правый щелчок мышью-&amp;gt;Run или &amp;quot;Run BeanExplorer SQL Query&amp;quot; на toolbar'е).&lt;br /&gt;
* Query Executor (view).&lt;br /&gt;
** Позволяет определить контекст выполнения SQL запроса - посредством выбора своих параметров запроса или сессии (при этом запрос пока выполняется только под администратором).&lt;br /&gt;
** Позволяет посмотреть результаты запуска SQL запроса. Автоматически активируется при SQL запросе. Позволяет посмотреть результаты запроса как в виде простой таблицы, так и в виде HTML после обработки в BeanExplorer, а также посмотреть обработанные представления запроса — после макропроцессора FreeMarker и в чистом SQL виде.&lt;br /&gt;
* JavaScript Editor (editor). Позволяет редактировать JavaScript скрипты - открывается при клике на JavaScript/server операции в дереве проекта. Почти то же самое, что и обычный JavaScript редактор из Eclipse JSDT. Отличается тем, что позволяет запускать Rhino JavaScript (&amp;quot;Run JavaScript&amp;quot; на toolbar'е или &amp;quot;Execute&amp;quot; в Operation Parameters view). Результат вызова операции открывается в браузере.&lt;br /&gt;
* Operation Parameters (view). Позволяет определить контекст выполнения JavaScript/server операции посредством задания параметров и выбранных строчек. Также позволяет выбрать метод для запуска: getParameters(), invoke() или getRedirectURL() (последний пока не поддерживается).&lt;br /&gt;
* Localization (view). [[Localizations|Локализация]], относящаяся к выделенному в дереве проектов элементу. Отображается при выборе entity, operation или query.&lt;br /&gt;
&lt;br /&gt;
== Основная информация для понимания BeanExplorer 4 ==&lt;br /&gt;
# Основное представление проекта BeanExplorer 4 - это не база данных, не YAML проект, а дерево проекта в Model view. При открытии BeanExplorer 4 проекта, он оказывается в Model view. И только при сохранении он сериализуется в YAML&lt;br /&gt;
# Основные простейшие действия с проектом - создание/удаление сущностей (entities), операций (operation) и запросов (query) - делаются из контекстного меню (pop-up) в Model view.&lt;br /&gt;
# Если с каким-нибудь узлом дерева проекта может быть связан редактор, то при выделении этого узла открывается редактор. Например, для JavaScript/server операции открывается JavaScript редактор, для 1D запроса - SQL редактор, для custom step - текстовый редактор, для Java операции открывается Java редактор (если .java файл с соответствующим именем находится в рабочем пространстве Eclipse). Некоторые редакторы при сохранении никак не меняют файлы - файлы будут изменены только при сохранении проекта.&lt;br /&gt;
# У большинство элементов из дерева проекта есть свойства, которые возможно редактировать в Properties view.&lt;br /&gt;
# Для любого подключения к базе данных необходим connection profile ([http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.datatools.connectivity.doc.user%2Fdoc%2Fhtml%2Fasc1229700343352.html в документации по Kepler]). При импорте готового проекта connection profile создаётся автоматически, однако вручную всё же необходимо выбрать к нему JDBC Connector (если СУБД для подключения используется впервые). Connection Profile необходим как для SQL запросов из обычного SQL редактора Eclipse DTP, так и для запросов BeanExplorer. Настройки connection profiles находятся в разделе проекта &amp;quot;Connection profiles&amp;quot;, в &amp;quot;папочках&amp;quot; Local и Remote. Эти настройки сохраняются в XML при сохранении BeanExplorer 4 проекта, а при его открытии воссоздаются, и если Eclipse DTP не имеет connection profiles с соответствующими именами, то они будут созданы. Конкретнее - эти настройки хранятся в двух файлах: connectionProfiles.local.xml и connectionProfiles.remote.xml, причём предполагается, что .local вписан в .gitignore, а .remote - нет. Для возможности подключиться к базе данных всегда должен быть выбран в качестве текущего какой-нибудь connection profile. Выбирается он в свойствах проекта (Properties view, &amp;quot;Connection profile name&amp;quot;) - в соответствующем combo box отображаются только те профили, которые есть в Local или Remote. Добавить новый connection profile в проект BeanExplorer 4 возможно через контекстное меню (для этого его сначала необходимо создать в Data Source Explorer view (из Eclipse DTP)).&lt;br /&gt;
&lt;br /&gt;
== Работа с BeanExplorer 4 для аналитиков ==&lt;br /&gt;
Для некоторых типов элементов из дерева проектов возможно приписывать комментарии/документацию. На данный момент это следующие типы элементов:&lt;br /&gt;
* проект,&lt;br /&gt;
* модули (в т.ч. application),&lt;br /&gt;
* сущности (entities - всё, что находится внутри модуля в папках Collections, Dictionaries, Tables, Generic Collections, Metadata),&lt;br /&gt;
* операции,&lt;br /&gt;
* запросы.&lt;br /&gt;
Документация отображается в Documentation view. Если в документации элемента есть маркер @todo или @check, то строка с этим маркером окажется и в другом view: Tasks. При клике на какую-либо строчку из Tasks будет выделен соответствующий ей элемент в Model view.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Analyst1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Возможности назначения ролей ===&lt;br /&gt;
* Все роли перечислены в свойствах проекта. При клике на список ролей (&amp;quot;Project roles&amp;quot; в Properties view при выбранно проекте) появляется панель, позволяющая добавлять роли.&lt;br /&gt;
* Для операций и запросов роли назначаются во view Security.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Analyst2.png]]&lt;br /&gt;
&lt;br /&gt;
== Usecases ==&lt;br /&gt;
Перенесены [[Usecases|сюда]].&lt;br /&gt;
&lt;br /&gt;
== Компиляция и запуск Eclipse с плагином BeanExplorer4 ==&lt;br /&gt;
Здесь: [[Компиляция и запуск BeanExplorer4]] (инструкции для тех, кто запускает Eclipse BeanExplorer4 из под другого экземпляра Eclipse).&lt;br /&gt;
&lt;br /&gt;
== Структура проекта BeanExplorer 4 ==&lt;br /&gt;
[[Структура проекта|Структура]] проекта BeanExplorer 4&lt;br /&gt;
&lt;br /&gt;
== Процесс разработки ==&lt;br /&gt;
=== Использование Ant ===&lt;br /&gt;
[[Использование ant|Использование Ant]]&lt;br /&gt;
&lt;br /&gt;
=== Использование шаблонов Freemarker ===&lt;br /&gt;
Использование шаблонов [[Freemarker|Freemarker]]&lt;br /&gt;
&lt;br /&gt;
=== JavaScript Debugger ===&lt;br /&gt;
Текущее состояние [[JavaScript Debugger|JavaScript Debugger]]&lt;br /&gt;
&lt;br /&gt;
=== Поддержка СУБД ===&lt;br /&gt;
Поддержка [[Поддержка СУБД|различных СУБД]]&lt;br /&gt;
&lt;br /&gt;
== Полезная информация, которая может помочь при работе с BeanExplorer 4 ==&lt;br /&gt;
=== Как устанавливать плагины/фитчи из архива ===&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки. Это может занять продолжительное время, т.к. с основного репозитория Eclipse будут скачиваться недостающие плагины.&lt;br /&gt;
&lt;br /&gt;
=== Где взять редактор YAML ===&lt;br /&gt;
Update site: &amp;lt;code&amp;gt;http://dadacoalition.org/yedit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Site: [https://code.google.com/p/yedit/ https://code.google.com/p/yedit/])&lt;br /&gt;
&lt;br /&gt;
=== Где взять редактор FreeMarker ===&lt;br /&gt;
Update site: &amp;lt;code&amp;gt;http://download.jboss.org/jbosstools/updates/stable/kepler/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или:&lt;br /&gt;
&lt;br /&gt;
Help-&amp;gt;Eclipse Marketplace... ищем &amp;quot;JBoss Tools&amp;quot;, жмём Install у JBoss Tools (Kepler), снимаем галочку со всего и выбираем JBoss Tools (Kepler)-&amp;gt;FreeMarker IDE.&lt;br /&gt;
&lt;br /&gt;
=== Как настроить Tomcat для возможности подгрузить изменения в class-файлах. ===&lt;br /&gt;
1. Add the following lines into /conf/tomcat-users.xml (inside the root element &amp;lt;tomcat-users&amp;gt;):&lt;br /&gt;
 &amp;lt;role rolename=&amp;quot;manager-script&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;user username=&amp;quot;tomcat&amp;quot; password=&amp;quot;tomcat&amp;quot; roles=&amp;quot;manager-script&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Create /conf/Catalina/localhost/manager.xml with the following content:&lt;br /&gt;
 &amp;lt;Context privileged=&amp;quot;true&amp;quot; antiResourceLocking=&amp;quot;false&amp;quot;&lt;br /&gt;
          docBase=&amp;quot;${catalina.home}/webapps/manager&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Valve className=&amp;quot;org.apache.catalina.valves.RemoteAddrValve&amp;quot;&lt;br /&gt;
         allow=&amp;quot;127\.0\.0\.1&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/Context&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробнее [http://tomcat.apache.org/tomcat-7.0-doc/manager-howto.html здесь] и [http://www.mulesoft.com/tcat/tomcat-reload здесь].&lt;br /&gt;
&lt;br /&gt;
3. You can change the username or the password, but you should ensure that your connection profile uses these username and password. Beside this you can change the URL that will be called to refresh Tomcat. Note that this action uses the Tomcat application name from the connection profile.&lt;br /&gt;
&lt;br /&gt;
=== Как создать новый профиль подключения к БД ===&lt;br /&gt;
* Переключиться в перспективу Database Development. (В Eclipse почти в правом верхнем углу нажать квадратную кнопку с плюсиком &amp;quot;Open Perspective&amp;quot; и выбрать там &amp;quot;Database Development&amp;quot;).&lt;br /&gt;
* Во view Data Source Explorer кликнуть правой кнопкой мыши на Database Connections, New....&lt;br /&gt;
* Выбрать в диалоговом окне тип используемой БД (напр., PostgreSQL), ввести нормальное имя для подключения (например, &amp;quot;condo&amp;quot;), Next.&lt;br /&gt;
* Ввести параметры подключения, их можно узнать у администратора БД. При первом создании профиля подключения с данным типом СУБД необходимо выбрать драйвер СУБД (для этого нажать круглишок с плюсиком у combo &amp;quot;Driver&amp;quot;, а в появившемся диалоге на второй вкладке обычно необходимо удалить выбранный драйвер и выбрать свой - мы для удобство поместили все драйвера в папку lib из be4).&lt;br /&gt;
* Next, Finish.&lt;br /&gt;
* Новый профиль появится в списке Database Connections во view Data Source Explorer.&lt;br /&gt;
&lt;br /&gt;
= Для разработчиков =&lt;br /&gt;
[[Для разработчиков BE4|Сюда]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4</id>
		<title>Компиляция и запуск BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4"/>
				<updated>2015-11-02T09:06:02Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Запуск из-под Eclipse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Простой запуск ===&lt;br /&gt;
Самый простой запуск:&lt;br /&gt;
# убедиться, что установлена Java 8 (JRE достаточно);&lt;br /&gt;
# установить из Eclipse MarketPlace плагин IvyDE.&lt;br /&gt;
# поместить исходники be4 в любую папку;&lt;br /&gt;
# сделать одно из следующих действий:&lt;br /&gt;
#* скачать готовый Eclipse для Windows x64 с files.dote.ru (обычно это архив eclipse.zip в папке Product-&amp;lt;ДАТА-ПУБЛИКАЦИИ&amp;gt; внутри \\files.dote.ru\pub2\_be4\Installation) и разархивировать в любую папку;&lt;br /&gt;
#* скачать Eclipse для своей ОС и установить на него содержимое архива repository.zip (обычно он находится в папке Product-&amp;lt;ДАТА-ПУБЛИКАЦИИ&amp;gt; внутри \\files.dote.ru\pub2\_be4\Installation).&lt;br /&gt;
&lt;br /&gt;
При запуске eclipse.exe спросит, откуда взять исходники be4, если не догадается об их местоположении.&lt;br /&gt;
&lt;br /&gt;
=== Запуск из-под Eclipse ===&lt;br /&gt;
Для компиляции необходимы&lt;br /&gt;
# '''Java 8''' [http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html отсюда],&lt;br /&gt;
# '''Eclipse IDE for Java EE Developers''', Eclipse '''Luna SR2''' [http://www.eclipse.org/downloads/packages/release/luna/sr2 отсюда],&lt;br /&gt;
# '''Наша версия Freemarker IDE'''.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Варианты установки Freemarker IDE ===&lt;br /&gt;
==== Вариант 1 (запуск без исходного кода Freemarker IDE). ====&lt;br /&gt;
Установить содержимое \\files.dote.ru\pub2\_be4\Installation\freemarker.feature.zip&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки.&lt;br /&gt;
&lt;br /&gt;
==== Вариант 2 (для разработчиков Freemarker IDE). ====&lt;br /&gt;
# Необходим репозиторий https://github.com/amaembo/jbosstools-freemarker.git&lt;br /&gt;
# После скачивания репозитория нужно импортировать два проекта:&lt;br /&gt;
#*- org.freemarker.core&lt;br /&gt;
#*- org.jboss.ide.eclipse.freemarker. Остальные проекты можно не импортировать или просто закрыть.&lt;br /&gt;
# Windows -&amp;gt; Preferences; Plug-In Development -&amp;gt; API Baselines; ввести произвольное имя, Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
=== Настройки запуска: ===&lt;br /&gt;
# Run-&amp;gt;Debug Configurations..., выбрать Eclipse Application, нажать New launch configuration.&lt;br /&gt;
# Выбрать каталог в Workspace data (лучше создать новый пустой, например, c:\projects\be4-workspace).&lt;br /&gt;
# Execution environment -&amp;gt; Java 1.8.&lt;br /&gt;
# Вкладка Arguments Скопировать это значение в поле VM Arguments: '''-Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx768m -ea'''&lt;br /&gt;
# Apply, Debug.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4</id>
		<title>Для разработчиков BE4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4"/>
				<updated>2014-12-05T10:18:06Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Автосериализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здесь будет информация по архитектуре BE4.&lt;br /&gt;
&lt;br /&gt;
На высоком уровне BE4 состоит из нескольких частей:&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро;&lt;br /&gt;
* com.beanexplorer.enterprise.metadata.ant - реализация Ant задач, объявленных в be4/src/be4lib.xml, эти классы не должны использоваться во время исполнения BEclipse;&lt;br /&gt;
* com.beanexplorer.enterprise.be4core - класс Be4QueryExecutor, необходимый для запуска Query относительно простым образом без необходимости хранить Query в таблице (в BE3 запуск Query происходит по имени или идентификатору Query в таблице queries, а мы в BE4 работаем только с модельными объектами представленными в виде Java объектов, а не строк в SQL таблицах); используется для запуска Query в BEeclipse и BE5;&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse - UI BEclipse и необходимые для его модельные элементы и view model;&lt;br /&gt;
* com.beanexplorer.enterprise.api - заготовка фасада для использования простейшего API в тестах: загрузка проекта из папки (projectApi = Facade.load(path)), получение корректного DatabaseConnector (projectApi.getDatabaseConnector()) и запуск Freemarker скриптов (projectApi.runFreemarkerScript(string));&lt;br /&gt;
* com.beanexplorer.enterprise.diagrams - здесь и модельные элементы, и UI для диаграмм; новые виды диаграм легче всего добавлять по аналогии со старыми, смотря на уже готовые классы;&lt;br /&gt;
* com.beanexplorer.enterprise.planning - здесь [http://ru.wikipedia.org/wiki/Model-View-ViewModel и Model, и ViewModel, и View] для для [[BeanExplorer4#Описание по каждому редактору и view|TasksView]].&lt;br /&gt;
&lt;br /&gt;
== Ядро ==&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро.&lt;br /&gt;
** exception - все базовые исключения для BE4, мы используем [http://en.wikipedia.org/wiki/Exception_handling#Checked_exceptions checked exceptions].&lt;br /&gt;
** '''model*''' - самое сердце BE4 - модельные объекты, которые представляют собой [[Структура проекта|дерево проекта]], начиная с класса [[Project]].&lt;br /&gt;
** sql - скачивание legacy метаданных (дерева проекта) из BE3 базы данных, синхронизация с базой данных. &lt;br /&gt;
** serialization - сохранённый на жёстком диске BE4 проект представляется как набор YAML файлов; данном пакете реализованы сериализация и десериализация YAML. &lt;br /&gt;
** freemarker - расширение Freemarker, в частности [[Built-ins|Be4BuiltIns]] и [[Встроенные функции|DatabaseFunctions]], [[макросы]] находятся в be4/src/com/beanexplorer/enterprise/metadata/freemarker/macro/common.ftl.&lt;br /&gt;
*** FreemarkerSqlHandler - получает на вход FreemarkerScript и запускает его как SQL, переадресуя сгенерированный текст в SqlExecutor.&lt;br /&gt;
** util - базовые полезности; должны находиться в этом пакете, даже если используются только в UI&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
Поскольку BEclipse - это плагин для Eclipse, UI реализован классическим способом для Eclipse плагинов. А именно:&lt;br /&gt;
* весь основной функционал описан в plugin.xml,&lt;br /&gt;
** это могут быть меню, команды, view, редакторы, wizard, страницы настроек и прочее. Для просмотра всего фунционала открываем plugin.xml на странице &amp;quot;Extensions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Команды ===&lt;br /&gt;
Для создания команды неоходимо зарегистрировать два расширения:&lt;br /&gt;
* org.eclipse.ui.commands&lt;br /&gt;
* org.eclipse.ui.handlers&lt;br /&gt;
Дело в том, что в Eclipse одна и та же команда может быть запущена разными обработчиками, так что команда разделена на две части - собственно command, представляет собой абстрактную команду с именем и описанием, и handler - обработчик, ссылается на класс, реализующий функционал этой команды и указывающий, может ли он в данный момент обработать действие. Например, в Eclipse есть стандартная команда &amp;quot;Debug&amp;quot;. В разных контекстах её обрабатывает разный обработчик - Java код запускается одним способом, а C++ код другим. При этом кнопка на панели инструментов и биндинг постоянно F11 ссылаются на одно и то же действие.&lt;br /&gt;
&lt;br /&gt;
Наши обработчики команд лежат в com.beanexplorer.enterprise.eclipse.handlers и имеют названия, представляющие собой глаголы.&lt;br /&gt;
&lt;br /&gt;
Так что для создания новой команды&lt;br /&gt;
* кликаем на org.eclipse.ui.commands в нашем редакторе plugin.xml на вкладке Extensions, New -&amp;gt; command, даём уникальный идентификатор, читаемое имя и категорию (categoryId) com.beanexplorer.be4.ui.commands,&lt;br /&gt;
* кликаем на org.eclipse.ui.handlers , New -&amp;gt; handler, выбираем только что созданную команду и новый класс из com.beanexplorer.enterprise.eclipse.handlers.&lt;br /&gt;
&lt;br /&gt;
=== Меню ===&lt;br /&gt;
Это расширение org.eclipse.ui.menus (New -&amp;gt; menuContribution). Общий вид ссылки на меню (locationURI):&lt;br /&gt;
* [menu|popup|toolbar]:&amp;lt;menuOrPartName&amp;gt;[?after=additions]&lt;br /&gt;
Здесь &amp;quot;menu&amp;quot;, &amp;quot;popup&amp;quot;, &amp;quot;toolbar&amp;quot; - предопределённые строки. &amp;lt;menuOrPartName&amp;gt; - либо &amp;quot;известное&amp;quot; имя типа org.eclipse.ui.main.menu или org.eclipse.ui.main.toolbar, либо имя редактора или view типа com.beanexplorer.enterprise.eclipse.BeProjectView.&lt;br /&gt;
&lt;br /&gt;
popup:com.beanexplorer.enterprise.eclipse.BeProjectView - это, в частности, контекстное меню нашего дерева проекта. Для добавления в него новой команды кликаем на надпись &amp;quot;popup:com.beanexplorer.enterprise.eclipse.BeProjectView&amp;quot; (слева в дереве), New -&amp;gt; command, выбираем команды, указываем текст и выбираем иконку. Готово!&lt;br /&gt;
&lt;br /&gt;
==== Замечание ====&lt;br /&gt;
Для того, чтобы найти класс с реализацией пункта меню, можно найти соответствующий пункт меню в редакторе plugin.xml, в нём будет указана команда, копируем имя команды в строку поиска в редакторе и находим нужный handler.&lt;br /&gt;
&lt;br /&gt;
=== Редакторы и view ===&lt;br /&gt;
Хранятся в&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.editors и&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.views соответственно.&lt;br /&gt;
Аналогично командам, создаются через редактор, кликаем на com.beanexplorer.enterprise.eclipse.editors, New -&amp;gt; editor, заполняем необходимые поля. Аналогично со view. Замечу, что клик на метку &amp;quot;class&amp;quot; позволяет создать нужный класс (в случае со view это org.eclipse.ui.part.ViewPart, например).&lt;br /&gt;
&lt;br /&gt;
=== Готовые диалоговые окна ===&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.dialogs.Dialogs - простые реализации диалоговых окошек, которых не хватает в org.eclipse.jface.dialogs.MessageDialog.&lt;br /&gt;
&lt;br /&gt;
=== MVVM и упрощение написания UI ===&lt;br /&gt;
Многие команды представляют собой одностраничные wizard'ы. Вместо того, чтобы писать с нуля, берём класс com.beanexplorer.enterprise.eclipse.handlers.templates.WizardCommandTemplateWizard, копируем в handlers, переименовываем (Alt+Shift+R) и заполняем всё что нужно.&lt;br /&gt;
&lt;br /&gt;
Хорошей практикой являет написание UI с использованием шаблона проектирования MVVM. Пример - CreateDaemonWizard.CreateDaemonWizardPage из CreateDaemon. Это хороший пример с использованием MVVM и моментальной валидацией ввода пользовательских данных, который полагается на класс Ui из com.beanexplorer.enterprise.eclipse.jface. Другие примеры можно найти поискав использования Ui.SimpleBinding&amp;lt;T&amp;gt;.addToWizardPage (Ctrl+Shift+G) или других методов Ui.SimpleBinding&amp;lt;T&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.Ui вообще содержит гибкую основу для реализации MVVM UI (примеры можно найти поискав использования класса Ui или его методов). &lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.JFace предоставляет методы для частовстречающихся сценариев (как правило создания виджетов внутри Composite с GridLayout из двух столбцов).&lt;br /&gt;
&lt;br /&gt;
=== События ===&lt;br /&gt;
&lt;br /&gt;
==== Автосериализация ====&lt;br /&gt;
Начинать смотреть с BeanExplorerProjectProvider.setProject - здесь регистрируются события разные события &amp;quot;codeChanged(SomeClass)&amp;quot; - в конечном счёте они вызывают Serialization.save(SomeClass).&lt;br /&gt;
&lt;br /&gt;
==== Автодесериализация ====&lt;br /&gt;
Начинасть смотреть с BeanExplorerProjectProvider.setProject - здесь регистрируется &amp;quot;onModify&amp;quot; (статическая функция ON_MODIFY). ON_MODIFY.apply(Path) определяет по пути тип файла и десериализует его. При открытии проекта путь файла регистрируется через project.getAutomaticDeserializationService().registerFile(Path, Type). WatchDir же слушает изменения в файловой системе и отправляет их в onModify.&lt;br /&gt;
&lt;br /&gt;
==== Другие события ====&lt;br /&gt;
См. различные BeanExplorerProjectProvider.registerLocal(ConcreteListener, Composite). Замечу, что structural change - полезное событие для того, чтобы обновить UI, если изменилось дерево модельных объектов. Изменени модельных объектов не вызывает автоматического перерисования UI - у нас нет такого вида событий!&lt;br /&gt;
&lt;br /&gt;
=== Действия и возможности ===&lt;br /&gt;
&lt;br /&gt;
==== Сохранение и открытие проекта ====&lt;br /&gt;
BeanExplorerProjectSource - простейший фасад для сохранения и открытия проекта из YAML.&lt;br /&gt;
&lt;br /&gt;
LegacyBeanExplorerProjectImporter - предоставляет возможность открывать BE3 проект из базы данных.&lt;br /&gt;
&lt;br /&gt;
==== JavaScript отладчик ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.javascript.RunJavaScriptOperationImpl и DebugJavaScriptOperationImpl - основные классы реализации.&lt;br /&gt;
&lt;br /&gt;
==== Запуск Query ====&lt;br /&gt;
Основывается на Be4QueryExecutor из com.beanexplorer.enterprise.be4core. См. класс &amp;quot;RunQuery&amp;quot; в качестве примера.&lt;br /&gt;
&lt;br /&gt;
==== Data Tools Platform: Connection Profiles ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.model.ConnectionProfiles позволяет преобразовывать наши модельные настройки в DTP connection profile и наоборот.&lt;br /&gt;
&lt;br /&gt;
==== Поиск в Project View ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.jface.DataElementsFilter&lt;br /&gt;
&lt;br /&gt;
==== Иконки и подсказки в Project View ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.views.BeanExplorerProjectViewLabelProvider - вычисляет иконки, рисует простые подсказки и делегирует сложные tooltip'ы (в виде таблиц с ошибками) классу FancyToolTipSupport из того же пакета.&lt;br /&gt;
&lt;br /&gt;
==== Сохранение состояния view ====&lt;br /&gt;
См. в качестве примера BeanExplorerProjectView.saveState (простейшие примеры - сохранение имени открытого проекта и выделенного элемента) и BeanExplorerProjectView.init (загрузка).&lt;br /&gt;
&lt;br /&gt;
==== Настройки ====&lt;br /&gt;
См. BeanExplorerPreferencesPage.createFieldEditors и BeanExplorerPreferences из com.beanexplorer.enterprise.eclipse.preferences.BeanExplorerPreferencesPage.&lt;br /&gt;
&lt;br /&gt;
==== Фоновые процессы ====&lt;br /&gt;
Запуск - new Job(&amp;quot;name&amp;quot;) { implementation }.schedule(). &amp;quot;Подождать&amp;quot; - пример в BeanExplorerProjectProvider.waitForSynchronization, &amp;quot;отменить&amp;quot; - пример в BeanExplorerProjectSource.cancelOpening. Замечу, что любые действия с UI должны делаться в UI потоке, поэтому для запуска кода в UI потоке из Job можно использовать:&lt;br /&gt;
* UiFunction.async(function) - оборачивает функцию;&lt;br /&gt;
* new AbstractUiSyncFunction&amp;lt;A, R&amp;gt;() { implementation }.apply(arg);&lt;br /&gt;
* EclipseUtils.runInUiThread(runnable) или EclipseUtils.runInUiThread(supplier) - асинхронный и синхронный запуск соответственно.&lt;br /&gt;
Подолнительно в EclipseUtils имеются методы для показа окошек с ошибками и предупреждениями из не UI потоков (типа openErrorByNonUiThread).&lt;br /&gt;
&lt;br /&gt;
==== Утилиты Eclipse ====&lt;br /&gt;
EclispeUtils содержит множество полезных методов, относящихся только к Eclipse UI:&lt;br /&gt;
* открытие или создание Java класса;&lt;br /&gt;
* создание проектов;&lt;br /&gt;
* открытие редакторов, view или wizard по идентификатору;&lt;br /&gt;
* копирование в буфер обмена;&lt;br /&gt;
* получение содержимого редакторов;&lt;br /&gt;
* сохранение открытых редакторов.&lt;br /&gt;
=== Статьи по SWT ===&lt;br /&gt;
[http://www.vogella.com/tutorials/SWT/article.html Вот здесь] вводная статья по SWT - объясняются основные концепции, какие виджеты бывают и как используются layout.&lt;br /&gt;
&lt;br /&gt;
А [http://www.vogella.com/tutorials/EclipseJFaceTable/article.html здесь] статья про JFace - библиотеку, упрощающую работу с таблицами и деревьями.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4</id>
		<title>Для разработчиков BE4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4"/>
				<updated>2014-12-05T09:55:24Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здесь будет информация по архитектуре BE4.&lt;br /&gt;
&lt;br /&gt;
На высоком уровне BE4 состоит из нескольких частей:&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро;&lt;br /&gt;
* com.beanexplorer.enterprise.metadata.ant - реализация Ant задач, объявленных в be4/src/be4lib.xml, эти классы не должны использоваться во время исполнения BEclipse;&lt;br /&gt;
* com.beanexplorer.enterprise.be4core - класс Be4QueryExecutor, необходимый для запуска Query относительно простым образом без необходимости хранить Query в таблице (в BE3 запуск Query происходит по имени или идентификатору Query в таблице queries, а мы в BE4 работаем только с модельными объектами представленными в виде Java объектов, а не строк в SQL таблицах); используется для запуска Query в BEeclipse и BE5;&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse - UI BEclipse и необходимые для его модельные элементы и view model;&lt;br /&gt;
* com.beanexplorer.enterprise.api - заготовка фасада для использования простейшего API в тестах: загрузка проекта из папки (projectApi = Facade.load(path)), получение корректного DatabaseConnector (projectApi.getDatabaseConnector()) и запуск Freemarker скриптов (projectApi.runFreemarkerScript(string));&lt;br /&gt;
* com.beanexplorer.enterprise.diagrams - здесь и модельные элементы, и UI для диаграмм; новые виды диаграм легче всего добавлять по аналогии со старыми, смотря на уже готовые классы;&lt;br /&gt;
* com.beanexplorer.enterprise.planning - здесь [http://ru.wikipedia.org/wiki/Model-View-ViewModel и Model, и ViewModel, и View] для для [[BeanExplorer4#Описание по каждому редактору и view|TasksView]].&lt;br /&gt;
&lt;br /&gt;
== Ядро ==&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро.&lt;br /&gt;
** exception - все базовые исключения для BE4, мы используем [http://en.wikipedia.org/wiki/Exception_handling#Checked_exceptions checked exceptions].&lt;br /&gt;
** '''model*''' - самое сердце BE4 - модельные объекты, которые представляют собой [[Структура проекта|дерево проекта]], начиная с класса [[Project]].&lt;br /&gt;
** sql - скачивание legacy метаданных (дерева проекта) из BE3 базы данных, синхронизация с базой данных. &lt;br /&gt;
** serialization - сохранённый на жёстком диске BE4 проект представляется как набор YAML файлов; данном пакете реализованы сериализация и десериализация YAML. &lt;br /&gt;
** freemarker - расширение Freemarker, в частности [[Built-ins|Be4BuiltIns]] и [[Встроенные функции|DatabaseFunctions]], [[макросы]] находятся в be4/src/com/beanexplorer/enterprise/metadata/freemarker/macro/common.ftl.&lt;br /&gt;
*** FreemarkerSqlHandler - получает на вход FreemarkerScript и запускает его как SQL, переадресуя сгенерированный текст в SqlExecutor.&lt;br /&gt;
** util - базовые полезности; должны находиться в этом пакете, даже если используются только в UI&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
Поскольку BEclipse - это плагин для Eclipse, UI реализован классическим способом для Eclipse плагинов. А именно:&lt;br /&gt;
* весь основной функционал описан в plugin.xml,&lt;br /&gt;
** это могут быть меню, команды, view, редакторы, wizard, страницы настроек и прочее. Для просмотра всего фунционала открываем plugin.xml на странице &amp;quot;Extensions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Команды ===&lt;br /&gt;
Для создания команды неоходимо зарегистрировать два расширения:&lt;br /&gt;
* org.eclipse.ui.commands&lt;br /&gt;
* org.eclipse.ui.handlers&lt;br /&gt;
Дело в том, что в Eclipse одна и та же команда может быть запущена разными обработчиками, так что команда разделена на две части - собственно command, представляет собой абстрактную команду с именем и описанием, и handler - обработчик, ссылается на класс, реализующий функционал этой команды и указывающий, может ли он в данный момент обработать действие. Например, в Eclipse есть стандартная команда &amp;quot;Debug&amp;quot;. В разных контекстах её обрабатывает разный обработчик - Java код запускается одним способом, а C++ код другим. При этом кнопка на панели инструментов и биндинг постоянно F11 ссылаются на одно и то же действие.&lt;br /&gt;
&lt;br /&gt;
Наши обработчики команд лежат в com.beanexplorer.enterprise.eclipse.handlers и имеют названия, представляющие собой глаголы.&lt;br /&gt;
&lt;br /&gt;
Так что для создания новой команды&lt;br /&gt;
* кликаем на org.eclipse.ui.commands в нашем редакторе plugin.xml на вкладке Extensions, New -&amp;gt; command, даём уникальный идентификатор, читаемое имя и категорию (categoryId) com.beanexplorer.be4.ui.commands,&lt;br /&gt;
* кликаем на org.eclipse.ui.handlers , New -&amp;gt; handler, выбираем только что созданную команду и новый класс из com.beanexplorer.enterprise.eclipse.handlers.&lt;br /&gt;
&lt;br /&gt;
=== Меню ===&lt;br /&gt;
Это расширение org.eclipse.ui.menus (New -&amp;gt; menuContribution). Общий вид ссылки на меню (locationURI):&lt;br /&gt;
* [menu|popup|toolbar]:&amp;lt;menuOrPartName&amp;gt;[?after=additions]&lt;br /&gt;
Здесь &amp;quot;menu&amp;quot;, &amp;quot;popup&amp;quot;, &amp;quot;toolbar&amp;quot; - предопределённые строки. &amp;lt;menuOrPartName&amp;gt; - либо &amp;quot;известное&amp;quot; имя типа org.eclipse.ui.main.menu или org.eclipse.ui.main.toolbar, либо имя редактора или view типа com.beanexplorer.enterprise.eclipse.BeProjectView.&lt;br /&gt;
&lt;br /&gt;
popup:com.beanexplorer.enterprise.eclipse.BeProjectView - это, в частности, контекстное меню нашего дерева проекта. Для добавления в него новой команды кликаем на надпись &amp;quot;popup:com.beanexplorer.enterprise.eclipse.BeProjectView&amp;quot; (слева в дереве), New -&amp;gt; command, выбираем команды, указываем текст и выбираем иконку. Готово!&lt;br /&gt;
&lt;br /&gt;
==== Замечание ====&lt;br /&gt;
Для того, чтобы найти класс с реализацией пункта меню, можно найти соответствующий пункт меню в редакторе plugin.xml, в нём будет указана команда, копируем имя команды в строку поиска в редакторе и находим нужный handler.&lt;br /&gt;
&lt;br /&gt;
=== Редакторы и view ===&lt;br /&gt;
Хранятся в&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.editors и&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.views соответственно.&lt;br /&gt;
Аналогично командам, создаются через редактор, кликаем на com.beanexplorer.enterprise.eclipse.editors, New -&amp;gt; editor, заполняем необходимые поля. Аналогично со view. Замечу, что клик на метку &amp;quot;class&amp;quot; позволяет создать нужный класс (в случае со view это org.eclipse.ui.part.ViewPart, например).&lt;br /&gt;
&lt;br /&gt;
=== Готовые диалоговые окна ===&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.dialogs.Dialogs - простые реализации диалоговых окошек, которых не хватает в org.eclipse.jface.dialogs.MessageDialog.&lt;br /&gt;
&lt;br /&gt;
=== MVVM и упрощение написания UI ===&lt;br /&gt;
Многие команды представляют собой одностраничные wizard'ы. Вместо того, чтобы писать с нуля, берём класс com.beanexplorer.enterprise.eclipse.handlers.templates.WizardCommandTemplateWizard, копируем в handlers, переименовываем (Alt+Shift+R) и заполняем всё что нужно.&lt;br /&gt;
&lt;br /&gt;
Хорошей практикой являет написание UI с использованием шаблона проектирования MVVM. Пример - CreateDaemonWizard.CreateDaemonWizardPage из CreateDaemon. Это хороший пример с использованием MVVM и моментальной валидацией ввода пользовательских данных, который полагается на класс Ui из com.beanexplorer.enterprise.eclipse.jface. Другие примеры можно найти поискав использования Ui.SimpleBinding&amp;lt;T&amp;gt;.addToWizardPage (Ctrl+Shift+G) или других методов Ui.SimpleBinding&amp;lt;T&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.Ui вообще содержит гибкую основу для реализации MVVM UI (примеры можно найти поискав использования класса Ui или его методов). &lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.JFace предоставляет методы для частовстречающихся сценариев (как правило создания виджетов внутри Composite с GridLayout из двух столбцов).&lt;br /&gt;
&lt;br /&gt;
=== События ===&lt;br /&gt;
&lt;br /&gt;
==== Автосериализация ====&lt;br /&gt;
Начинасть смотреть с BeanExplorerProjectProvider.setProject - здесь регистрируются события разные события &amp;quot;codeChanged(SomeClass)&amp;quot; - в конечном счёте они вызывают Serialization.save(SomeClass).&lt;br /&gt;
&lt;br /&gt;
==== Автодесериализация ====&lt;br /&gt;
Начинасть смотреть с BeanExplorerProjectProvider.setProject - здесь регистрируется &amp;quot;onModify&amp;quot; (статическая функция ON_MODIFY). ON_MODIFY.apply(Path) определяет по пути тип файла и десериализует его. При открытии проекта путь файла регистрируется через project.getAutomaticDeserializationService().registerFile(Path, Type). WatchDir же слушает изменения в файловой системе и отправляет их в onModify.&lt;br /&gt;
&lt;br /&gt;
==== Другие события ====&lt;br /&gt;
См. различные BeanExplorerProjectProvider.registerLocal(ConcreteListener, Composite). Замечу, что structural change - полезное событие для того, чтобы обновить UI, если изменилось дерево модельных объектов. Изменени модельных объектов не вызывает автоматического перерисования UI - у нас нет такого вида событий!&lt;br /&gt;
&lt;br /&gt;
=== Действия и возможности ===&lt;br /&gt;
&lt;br /&gt;
==== Сохранение и открытие проекта ====&lt;br /&gt;
BeanExplorerProjectSource - простейший фасад для сохранения и открытия проекта из YAML.&lt;br /&gt;
&lt;br /&gt;
LegacyBeanExplorerProjectImporter - предоставляет возможность открывать BE3 проект из базы данных.&lt;br /&gt;
&lt;br /&gt;
==== JavaScript отладчик ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.javascript.RunJavaScriptOperationImpl и DebugJavaScriptOperationImpl - основные классы реализации.&lt;br /&gt;
&lt;br /&gt;
==== Запуск Query ====&lt;br /&gt;
Основывается на Be4QueryExecutor из com.beanexplorer.enterprise.be4core. См. класс &amp;quot;RunQuery&amp;quot; в качестве примера.&lt;br /&gt;
&lt;br /&gt;
==== Data Tools Platform: Connection Profiles ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.model.ConnectionProfiles позволяет преобразовывать наши модельные настройки в DTP connection profile и наоборот.&lt;br /&gt;
&lt;br /&gt;
==== Поиск в Project View ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.jface.DataElementsFilter&lt;br /&gt;
&lt;br /&gt;
==== Иконки и подсказки в Project View ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.views.BeanExplorerProjectViewLabelProvider - вычисляет иконки, рисует простые подсказки и делегирует сложные tooltip'ы (в виде таблиц с ошибками) классу FancyToolTipSupport из того же пакета.&lt;br /&gt;
&lt;br /&gt;
==== Сохранение состояния view ====&lt;br /&gt;
См. в качестве примера BeanExplorerProjectView.saveState (простейшие примеры - сохранение имени открытого проекта и выделенного элемента) и BeanExplorerProjectView.init (загрузка).&lt;br /&gt;
&lt;br /&gt;
==== Настройки ====&lt;br /&gt;
См. BeanExplorerPreferencesPage.createFieldEditors и BeanExplorerPreferences из com.beanexplorer.enterprise.eclipse.preferences.BeanExplorerPreferencesPage.&lt;br /&gt;
&lt;br /&gt;
==== Фоновые процессы ====&lt;br /&gt;
Запуск - new Job(&amp;quot;name&amp;quot;) { implementation }.schedule(). &amp;quot;Подождать&amp;quot; - пример в BeanExplorerProjectProvider.waitForSynchronization, &amp;quot;отменить&amp;quot; - пример в BeanExplorerProjectSource.cancelOpening. Замечу, что любые действия с UI должны делаться в UI потоке, поэтому для запуска кода в UI потоке из Job можно использовать:&lt;br /&gt;
* UiFunction.async(function) - оборачивает функцию;&lt;br /&gt;
* new AbstractUiSyncFunction&amp;lt;A, R&amp;gt;() { implementation }.apply(arg);&lt;br /&gt;
* EclipseUtils.runInUiThread(runnable) или EclipseUtils.runInUiThread(supplier) - асинхронный и синхронный запуск соответственно.&lt;br /&gt;
Подолнительно в EclipseUtils имеются методы для показа окошек с ошибками и предупреждениями из не UI потоков (типа openErrorByNonUiThread).&lt;br /&gt;
&lt;br /&gt;
==== Утилиты Eclipse ====&lt;br /&gt;
EclispeUtils содержит множество полезных методов, относящихся только к Eclipse UI:&lt;br /&gt;
* открытие или создание Java класса;&lt;br /&gt;
* создание проектов;&lt;br /&gt;
* открытие редакторов, view или wizard по идентификатору;&lt;br /&gt;
* копирование в буфер обмена;&lt;br /&gt;
* получение содержимого редакторов;&lt;br /&gt;
* сохранение открытых редакторов.&lt;br /&gt;
=== Статьи по SWT ===&lt;br /&gt;
[http://www.vogella.com/tutorials/SWT/article.html Вот здесь] вводная статья по SWT - объясняются основные концепции, какие виджеты бывают и как используются layout.&lt;br /&gt;
&lt;br /&gt;
А [http://www.vogella.com/tutorials/EclipseJFaceTable/article.html здесь] статья про JFace - библиотеку, упрощающую работу с таблицами и деревьями.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4</id>
		<title>Для разработчиков BE4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4"/>
				<updated>2014-12-05T09:38:55Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здесь будет информация по архитектуре BE4.&lt;br /&gt;
&lt;br /&gt;
На высоком уровне BE4 состоит из нескольких частей:&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро;&lt;br /&gt;
* com.beanexplorer.enterprise.metadata.ant - реализация Ant задач, объявленных в be4/src/be4lib.xml, эти классы не должны использоваться во время исполнения BEclipse;&lt;br /&gt;
* com.beanexplorer.enterprise.be4core - класс Be4QueryExecutor, необходимый для запуска Query относительно простым образом без необходимости хранить Query в таблице (в BE3 запуск Query происходит по имени или идентификатору Query в таблице queries, а мы в BE4 работаем только с модельными объектами представленными в виде Java объектов, а не строк в SQL таблицах); используется для запуска Query в BEeclipse и BE5;&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse - UI BEclipse и необходимые для его модельные элементы и view model;&lt;br /&gt;
* com.beanexplorer.enterprise.api - заготовка фасада для использования простейшего API в тестах: загрузка проекта из папки (projectApi = Facade.load(path)), получение корректного DatabaseConnector (projectApi.getDatabaseConnector()) и запуск Freemarker скриптов (projectApi.runFreemarkerScript(string));&lt;br /&gt;
* com.beanexplorer.enterprise.diagrams - здесь и модельные элементы, и UI для диаграмм; новые виды диаграм легче всего добавлять по аналогии со старыми, смотря на уже готовые классы;&lt;br /&gt;
* com.beanexplorer.enterprise.planning - здесь [http://ru.wikipedia.org/wiki/Model-View-ViewModel и Model, и ViewModel, и View] для для [[BeanExplorer4#Описание по каждому редактору и view|TasksView]].&lt;br /&gt;
&lt;br /&gt;
== Ядро ==&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро.&lt;br /&gt;
** exception - все базовые исключения для BE4, мы используем [http://en.wikipedia.org/wiki/Exception_handling#Checked_exceptions checked exceptions].&lt;br /&gt;
** '''model*''' - самое сердце BE4 - модельные объекты, которые представляют собой [[Структура проекта|дерево проекта]], начиная с класса [[Project]].&lt;br /&gt;
** sql - скачивание legacy метаданных (дерева проекта) из BE3 базы данных, синхронизация с базой данных. &lt;br /&gt;
** serialization - сохранённый на жёстком диске BE4 проект представляется как набор YAML файлов; данном пакете реализованы сериализация и десериализация YAML. &lt;br /&gt;
** freemarker - расширение Freemarker, в частности [[Built-ins|Be4BuiltIns]] и [[Встроенные функции|DatabaseFunctions]], [[макросы]] находятся в be4/src/com/beanexplorer/enterprise/metadata/freemarker/macro/common.ftl.&lt;br /&gt;
*** FreemarkerSqlHandler - получает на вход FreemarkerScript и запускает его как SQL, переадресуя сгенерированный текст в SqlExecutor.&lt;br /&gt;
** util - базовые полезности; должны находиться в этом пакете, даже если используются только в UI&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
Поскольку BEclipse - это плагин для Eclipse, UI реализован классическим способом для Eclipse плагинов. А именно:&lt;br /&gt;
* весь основной функционал описан в plugin.xml,&lt;br /&gt;
** это могут быть меню, команды, view, редакторы, wizard, страницы настроек и прочее. Для просмотра всего фунционала открываем plugin.xml на странице &amp;quot;Extensions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Команды ===&lt;br /&gt;
Для создания команды неоходимо зарегистрировать два расширения:&lt;br /&gt;
* org.eclipse.ui.commands&lt;br /&gt;
* org.eclipse.ui.handlers&lt;br /&gt;
Дело в том, что в Eclipse одна и та же команда может быть запущена разными обработчиками, так что команда разделена на две части - собственно command, представляет собой абстрактную команду с именем и описанием, и handler - обработчик, ссылается на класс, реализующий функционал этой команды и указывающий, может ли он в данный момент обработать действие. Например, в Eclipse есть стандартная команда &amp;quot;Debug&amp;quot;. В разных контекстах её обрабатывает разный обработчик - Java код запускается одним способом, а C++ код другим. При этом кнопка на панели инструментов и биндинг постоянно F11 ссылаются на одно и то же действие.&lt;br /&gt;
&lt;br /&gt;
Наши обработчики команд лежат в com.beanexplorer.enterprise.eclipse.handlers и имеют названия, представляющие собой глаголы.&lt;br /&gt;
&lt;br /&gt;
Так что для создания новой команды&lt;br /&gt;
* кликаем на org.eclipse.ui.commands в нашем редакторе plugin.xml на вкладке Extensions, New -&amp;gt; command, даём уникальный идентификатор, читаемое имя и категорию (categoryId) com.beanexplorer.be4.ui.commands,&lt;br /&gt;
* кликаем на org.eclipse.ui.handlers , New -&amp;gt; handler, выбираем только что созданную команду и новый класс из com.beanexplorer.enterprise.eclipse.handlers.&lt;br /&gt;
&lt;br /&gt;
=== Меню ===&lt;br /&gt;
Это расширение org.eclipse.ui.menus (New -&amp;gt; menuContribution). Общий вид ссылки на меню (locationURI):&lt;br /&gt;
* [menu|popup|toolbar]:&amp;lt;menuOrPartName&amp;gt;[?after=additions]&lt;br /&gt;
Здесь &amp;quot;menu&amp;quot;, &amp;quot;popup&amp;quot;, &amp;quot;toolbar&amp;quot; - предопределённые строки. &amp;lt;menuOrPartName&amp;gt; - либо &amp;quot;известное&amp;quot; имя типа org.eclipse.ui.main.menu или org.eclipse.ui.main.toolbar, либо имя редактора или view типа com.beanexplorer.enterprise.eclipse.BeProjectView.&lt;br /&gt;
&lt;br /&gt;
popup:com.beanexplorer.enterprise.eclipse.BeProjectView - это, в частности, контекстное меню нашего дерева проекта. Для добавления в него новой команды кликаем на надпись &amp;quot;popup:com.beanexplorer.enterprise.eclipse.BeProjectView&amp;quot; (слева в дереве), New -&amp;gt; command, выбираем команды, указываем текст и выбираем иконку. Готово!&lt;br /&gt;
&lt;br /&gt;
==== Замечание ====&lt;br /&gt;
Для того, чтобы найти класс с реализацией пункта меню, можно найти соответствующий пункт меню в редакторе plugin.xml, в нём будет указана команда, копируем имя команды в строку поиска в редакторе и находим нужный handler.&lt;br /&gt;
&lt;br /&gt;
=== Редакторы и view ===&lt;br /&gt;
Хранятся в&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.editors и&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.views соответственно.&lt;br /&gt;
Аналогично командам, создаются через редактор, кликаем на com.beanexplorer.enterprise.eclipse.editors, New -&amp;gt; editor, заполняем необходимые поля. Аналогично со view. Замечу, что клик на метку &amp;quot;class&amp;quot; позволяет создать нужный класс (в случае со view это org.eclipse.ui.part.ViewPart, например).&lt;br /&gt;
&lt;br /&gt;
=== Готовые диалоговые окна ===&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.dialogs.Dialogs - простые реализации диалоговых окошек, которых не хватает в org.eclipse.jface.dialogs.MessageDialog.&lt;br /&gt;
&lt;br /&gt;
=== MVVM и упрощение написания UI ===&lt;br /&gt;
Многие команды представляют собой одностраничные wizard'ы. Вместо того, чтобы писать с нуля, берём класс com.beanexplorer.enterprise.eclipse.handlers.templates.WizardCommandTemplateWizard, копируем в handlers, переименовываем (Alt+Shift+R) и заполняем всё что нужно.&lt;br /&gt;
&lt;br /&gt;
Хорошей практикой являет написание UI с использованием шаблона проектирования MVVM. Пример - CreateDaemonWizard.CreateDaemonWizardPage из CreateDaemon. Это хороший пример с использованием MVVM и моментальной валидацией ввода пользовательских данных, который полагается на класс Ui из com.beanexplorer.enterprise.eclipse.jface. Другие примеры можно найти поискав использования Ui.SimpleBinding&amp;lt;T&amp;gt;.addToWizardPage (Ctrl+Shift+G) или других методов Ui.SimpleBinding&amp;lt;T&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.Ui вообще содержит гибкую основу для реализации MVVM UI (примеры можно найти поискав использования класса Ui или его методов). &lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.JFace предоставляет методы для частовстречающихся сценариев (как правило создания виджетов внутри Composite с GridLayout из двух столбцов).&lt;br /&gt;
&lt;br /&gt;
=== События ===&lt;br /&gt;
&lt;br /&gt;
==== Автосериализация ====&lt;br /&gt;
Начинасть смотреть с BeanExplorerProjectProvider.setProject - здесь регистрируются события разные события &amp;quot;codeChanged(SomeClass)&amp;quot; - в конечном счёте они вызывают Serialization.save(SomeClass).&lt;br /&gt;
&lt;br /&gt;
==== Автодесериализация ====&lt;br /&gt;
Начинасть смотреть с BeanExplorerProjectProvider.setProject - здесь регистрируется &amp;quot;onModify&amp;quot; (статическая функция ON_MODIFY). ON_MODIFY.apply(Path) определяет по пути тип файла и десериализует его. При открытии проекта путь файла регистрируется через project.getAutomaticDeserializationService().registerFile(Path, Type). WatchDir же слушает изменения в файловой системе и отправляет их в onModify.&lt;br /&gt;
&lt;br /&gt;
==== Другие события ====&lt;br /&gt;
См. различные BeanExplorerProjectProvider.registerLocal(ConcreteListener, Composite). Замечу, что structural change - полезное событие для того, чтобы обновить UI, если изменилось дерево модельных объектов. Изменени модельных объектов не вызывает автоматического перерисования UI - у нас нет такого вида событий!&lt;br /&gt;
&lt;br /&gt;
=== Действия и возможности ===&lt;br /&gt;
&lt;br /&gt;
==== Сохранение и открытие проекта ====&lt;br /&gt;
BeanExplorerProjectSource - простейший фасад для сохранения и открытия проекта из YAML.&lt;br /&gt;
&lt;br /&gt;
LegacyBeanExplorerProjectImporter - предоставляет возможность открывать BE3 проект из базы данных.&lt;br /&gt;
&lt;br /&gt;
==== JavaScript отладчик ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.javascript.RunJavaScriptOperationImpl и DebugJavaScriptOperationImpl - основные классы реализации.&lt;br /&gt;
&lt;br /&gt;
==== Запуск Query ====&lt;br /&gt;
Основывается на Be4QueryExecutor из com.beanexplorer.enterprise.be4core. См. класс &amp;quot;RunQuery&amp;quot; в качестве примера.&lt;br /&gt;
&lt;br /&gt;
==== Data Tools Platform: Connection Profiles ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.model.ConnectionProfiles позволяет преобразовывать наши модельные настройки в DTP connection profile и наоборот.&lt;br /&gt;
&lt;br /&gt;
==== Поиск в Project View ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.jface.DataElementsFilter&lt;br /&gt;
&lt;br /&gt;
==== Иконки и подсказки в Project View ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.views.BeanExplorerProjectViewLabelProvider - вычисляет иконки, рисует простые подсказки и делегирует сложные tooltip'ы (в виде таблиц с ошибками) классу FancyToolTipSupport из того же пакета.&lt;br /&gt;
&lt;br /&gt;
==== Сохранение состояния view ====&lt;br /&gt;
См. в качестве примера BeanExplorerProjectView.saveState (простейшие примеры - сохранение имени открытого проекта и выделенного элемента) и BeanExplorerProjectView.init (загрузка).&lt;br /&gt;
&lt;br /&gt;
==== Настройки ====&lt;br /&gt;
См. BeanExplorerPreferencesPage.createFieldEditors и BeanExplorerPreferences из com.beanexplorer.enterprise.eclipse.preferences.BeanExplorerPreferencesPage.&lt;br /&gt;
&lt;br /&gt;
=== Статьи по SWT ===&lt;br /&gt;
[http://www.vogella.com/tutorials/SWT/article.html Вот здесь] вводная статья по SWT - объясняются основные концепции, какие виджеты бывают и как используются layout.&lt;br /&gt;
&lt;br /&gt;
А [http://www.vogella.com/tutorials/EclipseJFaceTable/article.html здесь] статья про JFace - библиотеку, упрощающую работу с таблицами и деревьями.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4</id>
		<title>Для разработчиков BE4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4"/>
				<updated>2014-12-05T09:34:34Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здесь будет информация по архитектуре BE4.&lt;br /&gt;
&lt;br /&gt;
На высоком уровне BE4 состоит из нескольких частей:&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро;&lt;br /&gt;
* com.beanexplorer.enterprise.metadata.ant - реализация Ant задач, объявленных в be4/src/be4lib.xml, эти классы не должны использоваться во время исполнения BEclipse;&lt;br /&gt;
* com.beanexplorer.enterprise.be4core - класс Be4QueryExecutor, необходимый для запуска Query относительно простым образом без необходимости хранить Query в таблице (в BE3 запуск Query происходит по имени или идентификатору Query в таблице queries, а мы в BE4 работаем только с модельными объектами представленными в виде Java объектов, а не строк в SQL таблицах); используется для запуска Query в BEeclipse и BE5;&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse - UI BEclipse и необходимые для его модельные элементы и view model;&lt;br /&gt;
* com.beanexplorer.enterprise.api - заготовка фасада для использования простейшего API в тестах: загрузка проекта из папки (projectApi = Facade.load(path)), получение корректного DatabaseConnector (projectApi.getDatabaseConnector()) и запуск Freemarker скриптов (projectApi.runFreemarkerScript(string));&lt;br /&gt;
* com.beanexplorer.enterprise.diagrams - здесь и модельные элементы, и UI для диаграмм; новые виды диаграм легче всего добавлять по аналогии со старыми, смотря на уже готовые классы;&lt;br /&gt;
* com.beanexplorer.enterprise.planning - здесь [http://ru.wikipedia.org/wiki/Model-View-ViewModel и Model, и ViewModel, и View] для для [[BeanExplorer4#Описание по каждому редактору и view|TasksView]].&lt;br /&gt;
&lt;br /&gt;
== Ядро ==&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро.&lt;br /&gt;
** exception - все базовые исключения для BE4, мы используем [http://en.wikipedia.org/wiki/Exception_handling#Checked_exceptions checked exceptions].&lt;br /&gt;
** '''model*''' - самое сердце BE4 - модельные объекты, которые представляют собой [[Структура проекта|дерево проекта]], начиная с класса [[Project]].&lt;br /&gt;
** sql - скачивание legacy метаданных (дерева проекта) из BE3 базы данных, синхронизация с базой данных. &lt;br /&gt;
** serialization - сохранённый на жёстком диске BE4 проект представляется как набор YAML файлов; данном пакете реализованы сериализация и десериализация YAML. &lt;br /&gt;
** freemarker - расширение Freemarker, в частности [[Built-ins|Be4BuiltIns]] и [[Встроенные функции|DatabaseFunctions]], [[макросы]] находятся в be4/src/com/beanexplorer/enterprise/metadata/freemarker/macro/common.ftl.&lt;br /&gt;
*** FreemarkerSqlHandler - получает на вход FreemarkerScript и запускает его как SQL, переадресуя сгенерированный текст в SqlExecutor.&lt;br /&gt;
** util - базовые полезности; должны находиться в этом пакете, даже если используются только в UI&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
Поскольку BEclipse - это плагин для Eclipse, UI реализован классическим способом для Eclipse плагинов. А именно:&lt;br /&gt;
* весь основной функционал описан в plugin.xml,&lt;br /&gt;
** это могут быть меню, команды, view, редакторы, wizard, страницы настроек и прочее. Для просмотра всего фунционала открываем plugin.xml на странице &amp;quot;Extensions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Команды ===&lt;br /&gt;
Для создания команды неоходимо зарегистрировать два расширения:&lt;br /&gt;
* org.eclipse.ui.commands&lt;br /&gt;
* org.eclipse.ui.handlers&lt;br /&gt;
Дело в том, что в Eclipse одна и та же команда может быть запущена разными обработчиками, так что команда разделена на две части - собственно command, представляет собой абстрактную команду с именем и описанием, и handler - обработчик, ссылается на класс, реализующий функционал этой команды и указывающий, может ли он в данный момент обработать действие. Например, в Eclipse есть стандартная команда &amp;quot;Debug&amp;quot;. В разных контекстах её обрабатывает разный обработчик - Java код запускается одним способом, а C++ код другим. При этом кнопка на панели инструментов и биндинг постоянно F11 ссылаются на одно и то же действие.&lt;br /&gt;
&lt;br /&gt;
Наши обработчики команд лежат в com.beanexplorer.enterprise.eclipse.handlers и имеют названия, представляющие собой глаголы.&lt;br /&gt;
&lt;br /&gt;
Так что для создания новой команды&lt;br /&gt;
* кликаем на org.eclipse.ui.commands в нашем редакторе plugin.xml на вкладке Extensions, New -&amp;gt; command, даём уникальный идентификатор, читаемое имя и категорию (categoryId) com.beanexplorer.be4.ui.commands,&lt;br /&gt;
* кликаем на org.eclipse.ui.handlers , New -&amp;gt; handler, выбираем только что созданную команду и новый класс из com.beanexplorer.enterprise.eclipse.handlers.&lt;br /&gt;
&lt;br /&gt;
=== Меню ===&lt;br /&gt;
Это расширение org.eclipse.ui.menus (New -&amp;gt; menuContribution). Общий вид ссылки на меню (locationURI):&lt;br /&gt;
* [menu|popup|toolbar]:&amp;lt;menuOrPartName&amp;gt;[?after=additions]&lt;br /&gt;
Здесь &amp;quot;menu&amp;quot;, &amp;quot;popup&amp;quot;, &amp;quot;toolbar&amp;quot; - предопределённые строки. &amp;lt;menuOrPartName&amp;gt; - либо &amp;quot;известное&amp;quot; имя типа org.eclipse.ui.main.menu или org.eclipse.ui.main.toolbar, либо имя редактора или view типа com.beanexplorer.enterprise.eclipse.BeProjectView.&lt;br /&gt;
&lt;br /&gt;
popup:com.beanexplorer.enterprise.eclipse.BeProjectView - это, в частности, контекстное меню нашего дерева проекта. Для добавления в него новой команды кликаем на надпись &amp;quot;popup:com.beanexplorer.enterprise.eclipse.BeProjectView&amp;quot; (слева в дереве), New -&amp;gt; command, выбираем команды, указываем текст и выбираем иконку. Готово!&lt;br /&gt;
&lt;br /&gt;
==== Замечание ====&lt;br /&gt;
Для того, чтобы найти класс с реализацией пункта меню, можно найти соответствующий пункт меню в редакторе plugin.xml, в нём будет указана команда, копируем имя команды в строку поиска в редакторе и находим нужный handler.&lt;br /&gt;
&lt;br /&gt;
=== Редакторы и view ===&lt;br /&gt;
Хранятся в&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.editors и&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.views соответственно.&lt;br /&gt;
Аналогично командам, создаются через редактор, кликаем на com.beanexplorer.enterprise.eclipse.editors, New -&amp;gt; editor, заполняем необходимые поля. Аналогично со view. Замечу, что клик на метку &amp;quot;class&amp;quot; позволяет создать нужный класс (в случае со view это org.eclipse.ui.part.ViewPart, например).&lt;br /&gt;
&lt;br /&gt;
=== Готовые диалоговые окна ===&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.dialogs.Dialogs - простые реализации диалоговых окошек, которых не хватает в org.eclipse.jface.dialogs.MessageDialog.&lt;br /&gt;
&lt;br /&gt;
=== MVVM и упрощение написания UI ===&lt;br /&gt;
Многие команды представляют собой одностраничные wizard'ы. Вместо того, чтобы писать с нуля, берём класс com.beanexplorer.enterprise.eclipse.handlers.templates.WizardCommandTemplateWizard, копируем в handlers, переименовываем (Alt+Shift+R) и заполняем всё что нужно.&lt;br /&gt;
&lt;br /&gt;
Хорошей практикой являет написание UI с использованием шаблона проектирования MVVM. Пример - CreateDaemonWizard.CreateDaemonWizardPage из CreateDaemon. Это хороший пример с использованием MVVM и моментальной валидацией ввода пользовательских данных, который полагается на класс Ui из com.beanexplorer.enterprise.eclipse.jface. Другие примеры можно найти поискав использования Ui.SimpleBinding&amp;lt;T&amp;gt;.addToWizardPage (Ctrl+Shift+G) или других методов Ui.SimpleBinding&amp;lt;T&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.Ui вообще содержит гибкую основу для реализации MVVM UI (примеры можно найти поискав использования класса Ui или его методов). &lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.JFace предоставляет методы для частовстречающихся сценариев (как правило создания виджетов внутри Composite с GridLayout из двух столбцов).&lt;br /&gt;
&lt;br /&gt;
=== События ===&lt;br /&gt;
&lt;br /&gt;
==== Автосериализация ====&lt;br /&gt;
Начинасть смотреть с BeanExplorerProjectProvider.setProject - здесь регистрируются события разные события &amp;quot;codeChanged(SomeClass)&amp;quot; - в конечном счёте они вызывают Serialization.save(SomeClass).&lt;br /&gt;
&lt;br /&gt;
==== Автодесериализация ====&lt;br /&gt;
Начинасть смотреть с BeanExplorerProjectProvider.setProject - здесь регистрируется &amp;quot;onModify&amp;quot; (статическая функция ON_MODIFY). ON_MODIFY.apply(Path) определяет по пути тип файла и десериализует его. При открытии проекта путь файла регистрируется через project.getAutomaticDeserializationService().registerFile(Path, Type). WatchDir же слушает изменения в файловой системе и отправляет их в onModify.&lt;br /&gt;
&lt;br /&gt;
==== Другие события ====&lt;br /&gt;
См. различные BeanExplorerProjectProvider.registerLocal(ConcreteListener, Composite). Замечу, что structural change - полезное событие для того, чтобы обновить UI, если изменилось дерево модельных объектов. Изменени модельных объектов не вызывает автоматического перерисования UI - у нас нет такого вида событий!&lt;br /&gt;
&lt;br /&gt;
=== Действия и возможности ===&lt;br /&gt;
&lt;br /&gt;
==== Сохранение и открытие проекта ====&lt;br /&gt;
BeanExplorerProjectSource - простейший фасад для сохранения и открытия проекта из YAML.&lt;br /&gt;
&lt;br /&gt;
LegacyBeanExplorerProjectImporter - предоставляет возможность открывать BE3 проект из базы данных.&lt;br /&gt;
&lt;br /&gt;
==== JavaScript отладчик ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.javascript.RunJavaScriptOperationImpl и DebugJavaScriptOperationImpl - основные классы реализации.&lt;br /&gt;
&lt;br /&gt;
==== Запуск Query ====&lt;br /&gt;
Основывается на Be4QueryExecutor из com.beanexplorer.enterprise.be4core. См. класс &amp;quot;RunQuery&amp;quot; в качестве примера.&lt;br /&gt;
&lt;br /&gt;
==== Data Tools Platform: Connection Profiles ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.model.ConnectionProfiles позволяет преобразовывать наши модельные настройки в DTP connection profile и наоборот.&lt;br /&gt;
&lt;br /&gt;
==== Поиск в Project View ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.jface.DataElementsFilter&lt;br /&gt;
&lt;br /&gt;
==== Иконки и подсказки в Project View ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.views.BeanExplorerProjectViewLabelProvider - вычисляет иконки, рисует простые подсказки и делегирует сложные tooltip'ы (в виде таблиц с ошибками) классу FancyToolTipSupport из того же пакета.&lt;br /&gt;
&lt;br /&gt;
=== Статьи по SWT ===&lt;br /&gt;
[http://www.vogella.com/tutorials/SWT/article.html Вот здесь] вводная статья по SWT - объясняются основные концепции, какие виджеты бывают и как используются layout.&lt;br /&gt;
&lt;br /&gt;
А [http://www.vogella.com/tutorials/EclipseJFaceTable/article.html здесь] статья про JFace - библиотеку, упрощающую работу с таблицами и деревьями.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4</id>
		<title>Для разработчиков BE4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4"/>
				<updated>2014-12-05T09:01:40Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* MVVM и упрощение написания UI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здесь будет информация по архитектуре BE4.&lt;br /&gt;
&lt;br /&gt;
На высоком уровне BE4 состоит из нескольких частей:&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро;&lt;br /&gt;
* com.beanexplorer.enterprise.metadata.ant - реализация Ant задач, объявленных в be4/src/be4lib.xml, эти классы не должны использоваться во время исполнения BEclipse;&lt;br /&gt;
* com.beanexplorer.enterprise.be4core - класс Be4QueryExecutor, необходимый для запуска Query относительно простым образом без необходимости хранить Query в таблице (в BE3 запуск Query происходит по имени или идентификатору Query в таблице queries, а мы в BE4 работаем только с модельными объектами представленными в виде Java объектов, а не строк в SQL таблицах); используется для запуска Query в BEeclipse и BE5;&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse - UI BEclipse и необходимые для его модельные элементы и view model;&lt;br /&gt;
* com.beanexplorer.enterprise.api - заготовка фасада для использования простейшего API в тестах: загрузка проекта из папки (projectApi = Facade.load(path)), получение корректного DatabaseConnector (projectApi.getDatabaseConnector()) и запуск Freemarker скриптов (projectApi.runFreemarkerScript(string));&lt;br /&gt;
* com.beanexplorer.enterprise.diagrams - здесь и модельные элементы, и UI для диаграмм; новые виды диаграм легче всего добавлять по аналогии со старыми, смотря на уже готовые классы;&lt;br /&gt;
* com.beanexplorer.enterprise.planning - здесь [http://ru.wikipedia.org/wiki/Model-View-ViewModel и Model, и ViewModel, и View] для для [[BeanExplorer4#Описание по каждому редактору и view|TasksView]].&lt;br /&gt;
&lt;br /&gt;
== Ядро ==&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро.&lt;br /&gt;
** exception - все базовые исключения для BE4, мы используем [http://en.wikipedia.org/wiki/Exception_handling#Checked_exceptions checked exceptions].&lt;br /&gt;
** '''model*''' - самое сердце BE4 - модельные объекты, которые представляют собой [[Структура проекта|дерево проекта]], начиная с класса [[Project]].&lt;br /&gt;
** sql - скачивание legacy метаданных (дерева проекта) из BE3 базы данных, синхронизация с базой данных. &lt;br /&gt;
** serialization - сохранённый на жёстком диске BE4 проект представляется как набор YAML файлов; данном пакете реализованы сериализация и десериализация YAML. &lt;br /&gt;
** freemarker - расширение Freemarker, в частности [[Built-ins|Be4BuiltIns]] и [[Встроенные функции|DatabaseFunctions]], [[макросы]] находятся в be4/src/com/beanexplorer/enterprise/metadata/freemarker/macro/common.ftl.&lt;br /&gt;
*** FreemarkerSqlHandler - получает на вход FreemarkerScript и запускает его как SQL, переадресуя сгенерированный текст в SqlExecutor.&lt;br /&gt;
** util - базовые полезности; должны находиться в этом пакете, даже если используются только в UI&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
Поскольку BEclipse - это плагин для Eclipse, UI реализован классическим способом для Eclipse плагинов. А именно:&lt;br /&gt;
* весь основной функционал описан в plugin.xml,&lt;br /&gt;
** это могут быть меню, команды, view, редакторы, wizard, страницы настроек и прочее. Для просмотра всего фунционала открываем plugin.xml на странице &amp;quot;Extensions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Команды ===&lt;br /&gt;
Для создания команды неоходимо зарегистрировать два расширения:&lt;br /&gt;
* org.eclipse.ui.commands&lt;br /&gt;
* org.eclipse.ui.handlers&lt;br /&gt;
Дело в том, что в Eclipse одна и та же команда может быть запущена разными обработчиками, так что команда разделена на две части - собственно command, представляет собой абстрактную команду с именем и описанием, и handler - обработчик, ссылается на класс, реализующий функционал этой команды и указывающий, может ли он в данный момент обработать действие. Например, в Eclipse есть стандартная команда &amp;quot;Debug&amp;quot;. В разных контекстах её обрабатывает разный обработчик - Java код запускается одним способом, а C++ код другим. При этом кнопка на панели инструментов и биндинг постоянно F11 ссылаются на одно и то же действие.&lt;br /&gt;
&lt;br /&gt;
Наши обработчики команд лежат в com.beanexplorer.enterprise.eclipse.handlers и имеют названия, представляющие собой глаголы.&lt;br /&gt;
&lt;br /&gt;
Так что для создания новой команды&lt;br /&gt;
* кликаем на org.eclipse.ui.commands в нашем редакторе plugin.xml на вкладке Extensions, New -&amp;gt; command, даём уникальный идентификатор, читаемое имя и категорию (categoryId) com.beanexplorer.be4.ui.commands,&lt;br /&gt;
* кликаем на org.eclipse.ui.handlers , New -&amp;gt; handler, выбираем только что созданную команду и новый класс из com.beanexplorer.enterprise.eclipse.handlers.&lt;br /&gt;
&lt;br /&gt;
=== Меню ===&lt;br /&gt;
Это расширение org.eclipse.ui.menus (New -&amp;gt; menuContribution). Общий вид ссылки на меню (locationURI):&lt;br /&gt;
* [menu|popup|toolbar]:&amp;lt;menuOrPartName&amp;gt;[?after=additions]&lt;br /&gt;
Здесь &amp;quot;menu&amp;quot;, &amp;quot;popup&amp;quot;, &amp;quot;toolbar&amp;quot; - предопределённые строки. &amp;lt;menuOrPartName&amp;gt; - либо &amp;quot;известное&amp;quot; имя типа org.eclipse.ui.main.menu или org.eclipse.ui.main.toolbar, либо имя редактора или view типа com.beanexplorer.enterprise.eclipse.BeProjectView.&lt;br /&gt;
&lt;br /&gt;
popup:com.beanexplorer.enterprise.eclipse.BeProjectView - это, в частности, контекстное меню нашего дерева проекта. Для добавления в него новой команды кликаем на надпись &amp;quot;popup:com.beanexplorer.enterprise.eclipse.BeProjectView&amp;quot; (слева в дереве), New -&amp;gt; command, выбираем команды, указываем текст и выбираем иконку. Готово!&lt;br /&gt;
&lt;br /&gt;
==== Замечание ====&lt;br /&gt;
Для того, чтобы найти класс с реализацией пункта меню, можно найти соответствующий пункт меню в редакторе plugin.xml, в нём будет указана команда, копируем имя команды в строку поиска в редакторе и находим нужный handler.&lt;br /&gt;
&lt;br /&gt;
=== Редакторы и view ===&lt;br /&gt;
Хранятся в&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.editors и&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.views соответственно.&lt;br /&gt;
Аналогично командам, создаются через редактор, кликаем на com.beanexplorer.enterprise.eclipse.editors, New -&amp;gt; editor, заполняем необходимые поля. Аналогично со view. Замечу, что клик на метку &amp;quot;class&amp;quot; позволяет создать нужный класс (в случае со view это org.eclipse.ui.part.ViewPart, например).&lt;br /&gt;
&lt;br /&gt;
=== Готовые диалоговые окна ===&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.dialogs.Dialogs - простые реализации диалоговых окошек, которых не хватает в org.eclipse.jface.dialogs.MessageDialog.&lt;br /&gt;
&lt;br /&gt;
=== MVVM и упрощение написания UI ===&lt;br /&gt;
Многие команды представляют собой одностраничные wizard'ы. Вместо того, чтобы писать с нуля, берём класс com.beanexplorer.enterprise.eclipse.handlers.templates.WizardCommandTemplateWizard, копируем в handlers, переименовываем (Alt+Shift+R) и заполняем всё что нужно.&lt;br /&gt;
&lt;br /&gt;
Хорошей практикой являет написание UI с использованием шаблона проектирования MVVM. Пример - CreateDaemonWizard.CreateDaemonWizardPage из CreateDaemon. Это хороший пример с использованием MVVM и моментальной валидацией ввода пользовательских данных, который полагается на класс Ui из com.beanexplorer.enterprise.eclipse.jface. Другие примеры можно найти поискав использования Ui.SimpleBinding&amp;lt;T&amp;gt;.addToWizardPage (Ctrl+Shift+G) или других методов Ui.SimpleBinding&amp;lt;T&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.Ui вообще содержит гибкую основу для реализации MVVM UI (примеры можно найти поискав использования класса Ui или его методов). &lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.JFace предоставляет методы для частовстречающихся сценариев (как правило создания виджетов внутри Composite с GridLayout из двух столбцов).&lt;br /&gt;
&lt;br /&gt;
=== Статьи по SWT ===&lt;br /&gt;
[http://www.vogella.com/tutorials/SWT/article.html Вот здесь] вводная статья по SWT - объясняются основные концепции, какие виджеты бывают и как используются layout.&lt;br /&gt;
&lt;br /&gt;
А [http://www.vogella.com/tutorials/EclipseJFaceTable/article.html здесь] статья про JFace - библиотеку, упрощающую работу с таблицами и деревьями.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4</id>
		<title>Для разработчиков BE4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4"/>
				<updated>2014-12-05T08:58:46Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здесь будет информация по архитектуре BE4.&lt;br /&gt;
&lt;br /&gt;
На высоком уровне BE4 состоит из нескольких частей:&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро;&lt;br /&gt;
* com.beanexplorer.enterprise.metadata.ant - реализация Ant задач, объявленных в be4/src/be4lib.xml, эти классы не должны использоваться во время исполнения BEclipse;&lt;br /&gt;
* com.beanexplorer.enterprise.be4core - класс Be4QueryExecutor, необходимый для запуска Query относительно простым образом без необходимости хранить Query в таблице (в BE3 запуск Query происходит по имени или идентификатору Query в таблице queries, а мы в BE4 работаем только с модельными объектами представленными в виде Java объектов, а не строк в SQL таблицах); используется для запуска Query в BEeclipse и BE5;&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse - UI BEclipse и необходимые для его модельные элементы и view model;&lt;br /&gt;
* com.beanexplorer.enterprise.api - заготовка фасада для использования простейшего API в тестах: загрузка проекта из папки (projectApi = Facade.load(path)), получение корректного DatabaseConnector (projectApi.getDatabaseConnector()) и запуск Freemarker скриптов (projectApi.runFreemarkerScript(string));&lt;br /&gt;
* com.beanexplorer.enterprise.diagrams - здесь и модельные элементы, и UI для диаграмм; новые виды диаграм легче всего добавлять по аналогии со старыми, смотря на уже готовые классы;&lt;br /&gt;
* com.beanexplorer.enterprise.planning - здесь [http://ru.wikipedia.org/wiki/Model-View-ViewModel и Model, и ViewModel, и View] для для [[BeanExplorer4#Описание по каждому редактору и view|TasksView]].&lt;br /&gt;
&lt;br /&gt;
== Ядро ==&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро.&lt;br /&gt;
** exception - все базовые исключения для BE4, мы используем [http://en.wikipedia.org/wiki/Exception_handling#Checked_exceptions checked exceptions].&lt;br /&gt;
** '''model*''' - самое сердце BE4 - модельные объекты, которые представляют собой [[Структура проекта|дерево проекта]], начиная с класса [[Project]].&lt;br /&gt;
** sql - скачивание legacy метаданных (дерева проекта) из BE3 базы данных, синхронизация с базой данных. &lt;br /&gt;
** serialization - сохранённый на жёстком диске BE4 проект представляется как набор YAML файлов; данном пакете реализованы сериализация и десериализация YAML. &lt;br /&gt;
** freemarker - расширение Freemarker, в частности [[Built-ins|Be4BuiltIns]] и [[Встроенные функции|DatabaseFunctions]], [[макросы]] находятся в be4/src/com/beanexplorer/enterprise/metadata/freemarker/macro/common.ftl.&lt;br /&gt;
*** FreemarkerSqlHandler - получает на вход FreemarkerScript и запускает его как SQL, переадресуя сгенерированный текст в SqlExecutor.&lt;br /&gt;
** util - базовые полезности; должны находиться в этом пакете, даже если используются только в UI&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
Поскольку BEclipse - это плагин для Eclipse, UI реализован классическим способом для Eclipse плагинов. А именно:&lt;br /&gt;
* весь основной функционал описан в plugin.xml,&lt;br /&gt;
** это могут быть меню, команды, view, редакторы, wizard, страницы настроек и прочее. Для просмотра всего фунционала открываем plugin.xml на странице &amp;quot;Extensions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Команды ===&lt;br /&gt;
Для создания команды неоходимо зарегистрировать два расширения:&lt;br /&gt;
* org.eclipse.ui.commands&lt;br /&gt;
* org.eclipse.ui.handlers&lt;br /&gt;
Дело в том, что в Eclipse одна и та же команда может быть запущена разными обработчиками, так что команда разделена на две части - собственно command, представляет собой абстрактную команду с именем и описанием, и handler - обработчик, ссылается на класс, реализующий функционал этой команды и указывающий, может ли он в данный момент обработать действие. Например, в Eclipse есть стандартная команда &amp;quot;Debug&amp;quot;. В разных контекстах её обрабатывает разный обработчик - Java код запускается одним способом, а C++ код другим. При этом кнопка на панели инструментов и биндинг постоянно F11 ссылаются на одно и то же действие.&lt;br /&gt;
&lt;br /&gt;
Наши обработчики команд лежат в com.beanexplorer.enterprise.eclipse.handlers и имеют названия, представляющие собой глаголы.&lt;br /&gt;
&lt;br /&gt;
Так что для создания новой команды&lt;br /&gt;
* кликаем на org.eclipse.ui.commands в нашем редакторе plugin.xml на вкладке Extensions, New -&amp;gt; command, даём уникальный идентификатор, читаемое имя и категорию (categoryId) com.beanexplorer.be4.ui.commands,&lt;br /&gt;
* кликаем на org.eclipse.ui.handlers , New -&amp;gt; handler, выбираем только что созданную команду и новый класс из com.beanexplorer.enterprise.eclipse.handlers.&lt;br /&gt;
&lt;br /&gt;
=== Меню ===&lt;br /&gt;
Это расширение org.eclipse.ui.menus (New -&amp;gt; menuContribution). Общий вид ссылки на меню (locationURI):&lt;br /&gt;
* [menu|popup|toolbar]:&amp;lt;menuOrPartName&amp;gt;[?after=additions]&lt;br /&gt;
Здесь &amp;quot;menu&amp;quot;, &amp;quot;popup&amp;quot;, &amp;quot;toolbar&amp;quot; - предопределённые строки. &amp;lt;menuOrPartName&amp;gt; - либо &amp;quot;известное&amp;quot; имя типа org.eclipse.ui.main.menu или org.eclipse.ui.main.toolbar, либо имя редактора или view типа com.beanexplorer.enterprise.eclipse.BeProjectView.&lt;br /&gt;
&lt;br /&gt;
popup:com.beanexplorer.enterprise.eclipse.BeProjectView - это, в частности, контекстное меню нашего дерева проекта. Для добавления в него новой команды кликаем на надпись &amp;quot;popup:com.beanexplorer.enterprise.eclipse.BeProjectView&amp;quot; (слева в дереве), New -&amp;gt; command, выбираем команды, указываем текст и выбираем иконку. Готово!&lt;br /&gt;
&lt;br /&gt;
==== Замечание ====&lt;br /&gt;
Для того, чтобы найти класс с реализацией пункта меню, можно найти соответствующий пункт меню в редакторе plugin.xml, в нём будет указана команда, копируем имя команды в строку поиска в редакторе и находим нужный handler.&lt;br /&gt;
&lt;br /&gt;
=== Редакторы и view ===&lt;br /&gt;
Хранятся в&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.editors и&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.views соответственно.&lt;br /&gt;
Аналогично командам, создаются через редактор, кликаем на com.beanexplorer.enterprise.eclipse.editors, New -&amp;gt; editor, заполняем необходимые поля. Аналогично со view. Замечу, что клик на метку &amp;quot;class&amp;quot; позволяет создать нужный класс (в случае со view это org.eclipse.ui.part.ViewPart, например).&lt;br /&gt;
&lt;br /&gt;
=== Готовые диалоговые окна ===&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.dialogs.Dialogs - простые реализации диалоговых окошек, которых не хватает в org.eclipse.jface.dialogs.MessageDialog.&lt;br /&gt;
&lt;br /&gt;
=== MVVM и упрощение написания UI ===&lt;br /&gt;
Многие команды представляют собой одностраничные wizard'ы. Вместо того, чтобы писать с нуля, берём класс com.beanexplorer.enterprise.eclipse.handlers.templates.WizardCommandTemplateWizard, копируем в handlers, переименовываем (Alt+Shift+R) и заполняем всё что нужно.&lt;br /&gt;
&lt;br /&gt;
Хорошей практикой являет написание UI с использованием шаблона проектирования MVVM. Пример - CreateDaemonWizard.CreateDaemonWizardPage из CreateDaemon. Это хороший пример с использованием MVVM и моментальной валидацией ввода пользовательских данных, который полагается на класс Ui из com.beanexplorer.enterprise.eclipse.jface. Другие примеры можно найти поискав использования Ui.SimpleBinding&amp;lt;T&amp;gt;.addToWizardPage (Ctrl+Shift+G).&lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.Ui вообще содержит гибкую основу для реализации MVVM UI (примеры можно найти поискав использования класса Ui или его методов). &lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.JFace предоставляет методы для частовстречающихся сценариев (как правило создания виджетов внутри Composite с GridLayout из двух столбцов).&lt;br /&gt;
&lt;br /&gt;
=== Статьи по SWT ===&lt;br /&gt;
[http://www.vogella.com/tutorials/SWT/article.html Вот здесь] вводная статья по SWT - объясняются основные концепции, какие виджеты бывают и как используются layout.&lt;br /&gt;
&lt;br /&gt;
А [http://www.vogella.com/tutorials/EclipseJFaceTable/article.html здесь] статья про JFace - библиотеку, упрощающую работу с таблицами и деревьями.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	</feed>