angle-left

Liferay 7.x JSP hook - это просто!

Портал Liferay поддерживает большое число плагинов, позволяющих модифицировать его функциональность под ваши потребности. Помимо широко распростанённых портлетов очень удобным является так называемый "Hook plugin", позволяющий изменять "ядро" портала.

При переходе с Liferay 6.x на 7.x несколько изменился его SDK (в основном из-за перехода на использование OSGI), потому привычная структура плагинов изменилась. В данной статье я хочу описать процесс написания JSP hook'а, позволяющего заменить JSP-страницы самого лайфрея и основных его компнонентов (модулей/приложений).

Шаг 1. Ищем, что менять.

Итак, вы определились с тем, какое приложение вы хотите "пропатчить" своим хуком. Первый шаг для этого - определиться с актуальной версией приложения, используемой в портале. В этом нам поможет панель управления портала. Рассмотрим на примере Document Library.

Ищем наше приложение в App Manager'е (Control Panel -> Apps -> App Manager). Открыв его, мы обнаружим огромное количество модулей, из которого оно состоит.

Скорее всего, выбор нужного модуля не вызовет затруднений, так как их названия отражают их суть. Если же нет, то в поиске нужного поможет изучение исходного кода (его источник будет рассмотрен далее). В моём случае это Liferay Document Library Web.

Значимая информация здесь:

  1. ArtifactId: com.liferay.document.library.web
  2. Version: 3.0.40

Шаг 2. Понимаем, что именно менять.

Узнав основную информацию об артефакте, можно приступить к поиску его исходного кода. Очевидно, что расположен он в официальном репозитории на Гитхабе. Исходный код приложений находится в подкаталоге modules/apps. Откроем нужное нам приложение (в нужной ветке - 7.1 в моём случае) (modules/apps/document-library/document-library-web) и обнаружим там следующую картину (по состоянию на 16.05.2019):

Обратим особое внимание на файл bnd.bnd - это дескриптор OSGI модуля, и именно в нём прописана версия модуля. Соответственно, по истории изменений этого файла можно отследить коммит с версией кода, соответствующей нашему порталу.

Можно приступить к изучению файлов и поиску нужного - пусть интуиция вас не подведёт! JSP-страницы вы можете найти в подкаталоге src/main/resources/META-INF/resources/ требуемого модуля.

Шаг 3. Написание плагина.

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

Вообще, лайфрей предлагает несколько способов кастомизации JSP-страниц. Мы воспользуемся тем, что идейно ближе всего к тому хуку, что был в лайфрее 6.x - OSGI Fragments.

Будем использовать систему сборки Maven (просто потому что), тогда плагин можно сгенерировать из существующего архетипа:

mvn archetype:generate \
	-DarchetypeGroupId=com.liferay \
	-DarchetypeArtifactId=com.liferay.project.templates.fragment \
	-DliferayVersion=[REQUIRED_LIFERAY_VERSION] \
	-DgroupId=[MODULE_GROUP_ID] \
	-DartifactId=[MODULE_ARTIFACT_NAME] \
	-Dversion=[MODULE_VERSION] \
	-Dpackage=[PACKAGE_FOR_YOUR_CLASSES] \
	-DhostBundleSymbolicName=[LIFERAY_MODULE_ARTIFACT_ID] \
	-DhostBundleVersion=[LIFERAY_MDOULE_VERSION]

В моём случае команда получилась такая:

mvn archetype:generate \
	-DarchetypeGroupId=com.liferay \
	-DarchetypeArtifactId=com.liferay.project.templates.fragment \
	-DliferayVersion=7.1 \
	-DartifactId=dl-hook \
	-Dpackage=com.tuneit.ibox.dl.hook \
	-DgroupId=com.tuneit \
	-Dversion=1.0 \
	-DhostBundleSymbolicName=com.liferay.document.library.web \
	-DhostBundleVersion=3.0.40

И она сгенерировала мавеновский проект со следующей структурой:

В принципе, это стандартный пустой мавеновский проект с парой дополнительных файлов: build.gradle, если вы всё-таки решите пересесть с иглы мавена на модный грейдл, и bnd.bnd - уже знакомый нам дескриптор OSGI модуля. Посмотрим на него:

Bundle-Name: dl-hook
Bundle-SymbolicName: com.tuneit.ibox.dl.hook
Bundle-Version: 1.0
Fragment-Host: com.liferay.document.library.web;bundle-version="3.0.40"
-jsp: *.jsp,*.jspf
-plugin.jsp: com.liferay.ant.bnd.jsp.JspAnalyzerPlugin
-plugin.resourcebundle: com.liferay.ant.bnd.resource.bundle.ResourceBundleLoaderAnalyzerPlugin
-plugin.sass: com.liferay.ant.bnd.sass.SassAnalyzerPlugin
-sass: *

Особое значение для нас имеет строчка 

Fragment-Host: com.liferay.document.library.web;bundle-version="3.0.40"

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

Остался последний вопрос где: создавать JSP-страницы? Вам достаточно просто воспроизвести структуру модуля. Так, я хотел заменить файл /src/main/resources/META-INF/resources/document_library/folder_action.jsp - и я просто воспроизвёл такую же структуру в своём проекте.

В свои файлы вы можете скопировать исходный код из нужной вам версии модуля, после чего внести нужные вам изменения - или даже написать всё с нуля, никто вас в этом не ограничивает!

 

Засим откланиваюсь, прощайте.