середа, 17 березня 2010 р.

Liferay::EXT

EXT Environment

основа Liferay это Spring, Hibernate и AXIS.
Spring управляет зависимостями и инекциями классов между модулями. он же управляет транзакциями, содержит конфигурацию различного рода кешей, пулов, источников данных
Hibernate управляет собственно данными
AXIS предоставляет доступ к данным через веб-сервисы
вокруг этих технлогий Liferay имеет надстройку из собственных классов, которая и является ESB Liferay. эта ESB, в свою очередь, спроектирована по принципу Service Oriented Architecture и разделена на три части:
  1. Persistence Beans, которые являются ничем иным, как объектами Hibernate мэпинга
  2. сервисами, реализующими логику доступа и управления данными
  3. сервисами, обеспечивающими удаленный доступ к логике управления lанными

EXT Environment это сконфигирурованная и готовая к использованию структура директорий, позволяющая просто и прозрачно расширять ESB Liferay. структура директрий генеруется таском build-ext из исходников портала. основными модулями кастомизации являются ext-impl, ext-service и ext-web. директории содержат расширеня presentation layer (ext-web) и persistence layer (ext-impl и ext-service), причем в ext-service лежат декларации сервисов persistence layer, а в ext-impl -- реализации.
для расширения платформы используется класс service.xml, этот класс содержит описание сущностей, которые будут представлены таблицами базы данных и объектами мэппинга Hibernate. формат файла очень похож на формат hbernate.xml, но есть ряд сущетсвенных ограничений для типов сущностей, типов полей сущностей, типов связей и тому подобное. файл этот обрабатывается классом ServiceBuilder, который и генерирует все необходмые классы и конфигурационные файлы для портальной ESB
но ServiceBuilder нужен не только для этого

service.xml

основными элементами service.xml являются
  • entity -- елемент описание сущности, кроме объявления полей объекта и базы данных содержит в себе все ниже перечисленные
  • many-to-one (many-to-many) -- описание связи между сущностями аналогичное Hibernate
  • finder -- по умолчанию, объекты ESB содержат методы для содания, обновление, удаления записи в базе. поиска по первичному ключу и поиска всех записей. если сущность предполагает поиск по какому-то кастомному сочению полей, описывается finder, который и является декларацией соотвествующего метода в итоге

*ServiceImpl и *LocalServiceImpl

каждая entity, описанная в service.xml превращается в набор классов (до 8 штук) ESB Liferay. уже после генерации классов они содержат методы для базовых операций с данными. иными словами, классы уже являются полноценной кастомизацией ESB. в случае, когда базовых операций недостаточно, на помощь приходят классы *ServiceImpl и *LocalServiceImpl. как явствует из названия, класс *LocalServiceImpl содержит методы, доступные для использования только в рамках одного хоста, а класс *ServiceImpl -- доступные для удаленных вызово. в те времена, когда Liferay был реализован с использованием технологии EJB, это были реализации интерфейсов EJBHome и EJBLocalHome соотвественно. сейчас *ServiceImpl используется для генерации веб сервисов. как правило, основную реализацию дополнительного функционала работы с данными содержит *LocalServiceImpl, *ServiceImpl просто вызывает соотвествующие методы *LocalServiceImpl с минимальной пре- и постобработкой параметров. чтобы исключить дублирование кода. однако, никто никаких запретов на реализацию каждого из сервисов отдельно нет.

*FinderImpl и custom_sql.xml

и последняя точка расширения ESB это реализация custom finders. в service.xml можно описать только простые finders, для которых перечислить поля сущеностей и указать оператор сравнения. если нужно выполнить сложный запрос, или динамически включить/исключить критерии выборки, или реализовать платформенно-зависимую выборку, то необходим custom finder. его реализация чрезвычайно проста
  1. в директории ext-impl/src, в пакете com.liferay.portal.service.persistence создается класс *FinderImpl
  2. в файле custom_sql.xml объявляется тэг с единственным аттрибутом -- id, являющимся уникальным идентификатором SQL запроса. в теле тэга описываться сам текст SQL запроса в JDBC или Hibernate нотации
  3. в классе *FinderImpl реализуется логика обработки, выполнения и обработки результатов выполнения запроса

резюме

для собственно кастомизации ESB Liferay необходимо:
  1. определить entity и finders в service.xml
  2. запустить ant таск для генерации кода
  3. реализовать дополнительный функционал работы с базой данных внутри классов *FinderImpl и описать соотвествующие запросы в custom_sql.xml
  4. запустить ant таск для генерации кода
  5. реализовать сами методы внутри классов *LocalServiceImpl и/или *ServiceImpl
  6. запустить ant таск для генерации кода
  7. и дальше можно запускать ant таск deploy или сразу оба clean deploy
Важно! все изменения классов *LocalServiceImpl, *ServiceImpl и *FinderImpl автоматически попадают в связанные классы и интерфейсы ESB после запуска. эти классы создаются единожды и более не перезаписываются автоматически сгенерированными. наоборот, являются источником для изменения остальных сгенерированных классов