понеділок, 31 березня 2008 р.

Liferay 4.2.2 themes handling bug

копия моей статьи на Liveinternet.ru от 11 июля 2007
Ошибка обработки идентификаторов темы в Liferay Portal 4.2.2
для версии 4.2.2 Liferay Portal зафиксирована не корректная работа с идентификаторами портальных тем, развернутых как внешние WAR-приложения с помощью механизма автоматического развертывания компонентов портала (тем, шаблонов расположения и портлетов).
проблема
ошибка заключается в возникновении java.lang.NullPointerException (далее NPE) при обращении к настройкам вида и поведения созданного комьюнити/группы/пользователя при установке темы, развернутой как внешнее WAR-приложение (далее Тема), в качестве темы используемой по умолчанию.
после исследования проблемы, определено, что источником ошибки является не корректная работа с идентификатором темы.
причины возникновения
для всех компонентов, развернутых с использованием механизма авто-развертывания, Liferay Portal генерирует сложные идентификаторы по шаблону <theme-id>_WAR_<web.xml_display_name>. к примеру если тема имеет theme-id=foo, определенный в liferay-look-and-feel.xml, и display-name=bar, определенный в web.xml, то конечный идентификатор Темы в Liferay Portal будет foo_WAR_bar.
стандартная документация описывает изменение параметров, установленных по-умолчанию, с использованием идентификатора темы в том виде, в котором он определен в liferay-look-and-feel.xml (для примера приведенного выше -- foo). однако, API портала не обрабатывает идентификатор для Тем и использует его значение из portal(-ext).properties без изменений. таким образом, происходит попытка обращения к несуществующей Теме и возникает NPE.
решение
для решения данной проблемы необходимо определять идентификатор темы в portal(-ext).properties с учетом его автоматической модификации внутри портала. иными словами, значение параметра default.theme.id должно быть не theme_id, а <theme_id_WAR_<web.xml_display_name>. дла описанного выше примера соотвественно -- не default.theme.id=foo, а default.theme.id=foo_WAR_bar.
для использования произвольной Темы, в качестве темы по-умолчанию, будет полезна следующая инструкция:
1. развернуть Тему следуя стандартному процессу.
2. авторизоваться в Liferay Portal как пользователь с правами администратора и установить Тему в качестве темы любого доступного компьюнити.
3. открыть базу данных портала в любом SQL-клиенте.
4. выполнить select themeId from layoutset where groupId = (select groupId from group_ where name = )>, где community_name - имя комьюнити, где использована Тема.
5. использовать выбранный идентификатор, как значение параметра default.theme.id
область распространения
проблема выявлена для версии портала 4.2.2 и не тестировалась на других версиях. не исключено исправление ошибки в старших и отсутствие в младших версиях.
для предустановленных тем портала стандартный механизм работает корректно.
ссылки
комментарий на форуме Liferay Portal(англ.)