当我的插件部署到 Liferay 时,我如何 运行 采取一些行动?
How can I run some action when my plugin was deployed to Liferay?
我想 运行 在我的 plugin(portlet,hook 或 theme) 在 Liferay 中可用。
我在 liferay-plugin-package.xml
、liferay-portlet.xml
、liferay-hook.xml
或 liferay-look-and-feel.xml
中找不到类似 启动侦听器 的东西。
如果您的插件中有一个 portlet,您可以 运行 Portlet.init(PortletConfig)
中的代码。
但这并不总是可能的,因为
- 你没有 portlet
- 您没有自己的 portlet 实现(例如,因为您使用 JSF)
- 代码不属于任何 portlet,您不想将它随机添加到其中一个
在这种情况下,您还有另外两个选择:
创建一个为每个门户实例调用的启动操作(请参阅 answer of gevatterjan)。如果您需要为每个门户实例 运行 编码,这是最好的解决方案。
或者您使用 ServletContextListener
和 PortalLifecycle
的组合,当插件可用时启动一次。如果您只想 运行 一次,这是最好的解决方案,例如创建调度程序或替换 liferay-hook.xml
resp 未涵盖的 Liferay 函数。 portal.properties
.
@WebListener
public class MyStartupListener implements ServletContextListener, PortalLifecycle {
@Override
public void contextInitialized(final ServletContextEvent sce) {
// Wait until the portal is ready
PortalLifecycleUtil.register(this, PortalLifecycle.METHOD_INIT);
}
@Override
public void portalInit() {
// Here comes our initialization code
...
}
@Override
public void contextDestroyed(final ServletContextEvent event) {
// Here comes our uninitialization code, if any
...
}
@Override
public void portalDestroy() {
// Ignore
}
}
您可以调用任何 Liferay 函数,但要小心:
您的线程未连接到任何请求 - 当前没有 门户实例 (Company
), 站点 ( Group
)、页面 (Layout
) 或 用户。您可以使用适当的 *ServiceLocalUtil
函数找到所有这些。对于某些操作,您需要为 CompanyThreadLocal
、PricipalThreadLocal
和 PermissionThreadLocal
.
中的线程设置这些值
还有一个办法。您可以利用 StartupAction。它只是一个事件,每次启动插件时都会触发。此方法只会在服务器启动或部署时触发一次。认识到,doRun 方法获取一个 companyIds 的字符串数组作为参数。 companyId 表示门户实例(Liferay 内部实例。不是另一个应用程序服务器。)
例如,我有一个 portlet,我在其中依赖于一些自定义字段。所以我有这个整洁的小 class:
package de.osc.kaleositeaddon.startup;
import com.liferay.portal.kernel.events.ActionException;
import com.liferay.portal.kernel.events.SimpleAction;
public class StartupAction extends SimpleAction {
@Override
public void run(String[] companyIds) throws ActionException {
setupExpandoAction.run(companyIds);
importMessagesAction.run(companyIds);
}
private SetupExpandoAction setupExpandoAction = new SetupExpandoAction();
private ImportMessagesAction importMessagesAction = new ImportMessagesAction();
}
SetupExpandoAction 是:
package de.osc.kaleositeaddon.startup;
import com.liferay.portal.kernel.events.ActionException;
import com.liferay.portal.kernel.events.SimpleAction;
import com.liferay.portal.model.Group;
import com.liferay.portal.model.ResourceConstants;
import com.liferay.portal.model.Role;
import com.liferay.portal.model.RoleConstants;
import com.liferay.portal.security.permission.ActionKeys;
import com.liferay.portal.service.ResourcePermissionLocalServiceUtil;
import com.liferay.portal.service.RoleLocalServiceUtil;
import com.liferay.portlet.expando.DuplicateColumnNameException;
import com.liferay.portlet.expando.DuplicateTableNameException;
import com.liferay.portlet.expando.model.ExpandoColumn;
import com.liferay.portlet.expando.model.ExpandoColumnConstants;
import com.liferay.portlet.expando.model.ExpandoTable;
import com.liferay.portlet.expando.model.ExpandoTableConstants;
import com.liferay.portlet.expando.service.ExpandoColumnLocalServiceUtil;
import com.liferay.portlet.expando.service.ExpandoTableLocalServiceUtil;
import com.liferay.portlet.journal.model.JournalArticle;
import de.osc.kaleositeaddon.service.constants.ExpandoConstants;
public class SetupExpandoAction extends SimpleAction {
@Override
public void run(String[] companyIds) throws ActionException {
for (int i = 0; i < companyIds.length; i++) {
long companyId = Long.parseLong(companyIds[i]);
try {
setupExpandoGroup(companyId);
} catch (Exception e) {
e.printStackTrace();
}
}
}
protected void setupExpandoGroup(long companyId) throws Exception {
ExpandoTable table = null;
try {
table = ExpandoTableLocalServiceUtil.addTable(companyId, Group.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME);
} catch (DuplicateTableNameException dtne) {
table = ExpandoTableLocalServiceUtil.getTable(companyId, Group.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME);
}
/*
* Setup StartDate
*/
try {
ExpandoColumn column = ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(),
ExpandoConstants.EXPANDO_COLUMN_NAME_START_DATE, ExpandoColumnConstants.DATE);
column.setDefaultData("");
Role user = RoleLocalServiceUtil.getRole(companyId, RoleConstants.GUEST);
ResourcePermissionLocalServiceUtil.setResourcePermissions(companyId, ExpandoColumn.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL,
String.valueOf(column.getColumnId()), user.getRoleId(), new String[] { ActionKeys.VIEW});
}
catch (DuplicateColumnNameException dcne) {
}
/*
* Setup EndDate
*/
try {
ExpandoColumn column = ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(),
ExpandoConstants.EXPANDO_COLUMN_NAME_END_DATE, ExpandoColumnConstants.DATE);
column.setDefaultData("");
Role user = RoleLocalServiceUtil.getRole(companyId, RoleConstants.GUEST);
ResourcePermissionLocalServiceUtil.setResourcePermissions(companyId, ExpandoColumn.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL,
String.valueOf(column.getColumnId()), user.getRoleId(), new String[] { ActionKeys.VIEW});
}
catch (DuplicateColumnNameException dcne) {
}
try {
ExpandoColumn column = ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(),
ExpandoConstants.EXPANDO_COLUMN_NAME_CREATE_DATE, ExpandoColumnConstants.DATE);
column.setDefaultData("");
Role user = RoleLocalServiceUtil.getRole(companyId, RoleConstants.GUEST);
ResourcePermissionLocalServiceUtil.setResourcePermissions(companyId, ExpandoColumn.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL,
String.valueOf(column.getColumnId()), user.getRoleId(), new String[] { ActionKeys.VIEW});
}
catch (DuplicateColumnNameException dcne) {
}
}
}
在您的 liferay-hook.xml 文件中,您执行以下操作:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.0.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_0_0.dtd">
<hook>
<portal-properties>portal.properties</portal-properties>
</hook>
然后在 portal.properties 中添加这一行:
application.startup.events=de.osc.kaleositeaddon.startup.StartupAction
记得替换 class 个名字 ;)
我想 运行 在我的 plugin(portlet,hook 或 theme) 在 Liferay 中可用。
我在 liferay-plugin-package.xml
、liferay-portlet.xml
、liferay-hook.xml
或 liferay-look-and-feel.xml
中找不到类似 启动侦听器 的东西。
如果您的插件中有一个 portlet,您可以 运行 Portlet.init(PortletConfig)
中的代码。
但这并不总是可能的,因为
- 你没有 portlet
- 您没有自己的 portlet 实现(例如,因为您使用 JSF)
- 代码不属于任何 portlet,您不想将它随机添加到其中一个
在这种情况下,您还有另外两个选择:
创建一个为每个门户实例调用的启动操作(请参阅 answer of gevatterjan)。如果您需要为每个门户实例 运行 编码,这是最好的解决方案。
或者您使用 ServletContextListener
和 PortalLifecycle
的组合,当插件可用时启动一次。如果您只想 运行 一次,这是最好的解决方案,例如创建调度程序或替换 liferay-hook.xml
resp 未涵盖的 Liferay 函数。 portal.properties
.
@WebListener
public class MyStartupListener implements ServletContextListener, PortalLifecycle {
@Override
public void contextInitialized(final ServletContextEvent sce) {
// Wait until the portal is ready
PortalLifecycleUtil.register(this, PortalLifecycle.METHOD_INIT);
}
@Override
public void portalInit() {
// Here comes our initialization code
...
}
@Override
public void contextDestroyed(final ServletContextEvent event) {
// Here comes our uninitialization code, if any
...
}
@Override
public void portalDestroy() {
// Ignore
}
}
您可以调用任何 Liferay 函数,但要小心:
您的线程未连接到任何请求 - 当前没有 门户实例 (Company
), 站点 ( Group
)、页面 (Layout
) 或 用户。您可以使用适当的 *ServiceLocalUtil
函数找到所有这些。对于某些操作,您需要为 CompanyThreadLocal
、PricipalThreadLocal
和 PermissionThreadLocal
.
还有一个办法。您可以利用 StartupAction。它只是一个事件,每次启动插件时都会触发。此方法只会在服务器启动或部署时触发一次。认识到,doRun 方法获取一个 companyIds 的字符串数组作为参数。 companyId 表示门户实例(Liferay 内部实例。不是另一个应用程序服务器。)
例如,我有一个 portlet,我在其中依赖于一些自定义字段。所以我有这个整洁的小 class:
package de.osc.kaleositeaddon.startup;
import com.liferay.portal.kernel.events.ActionException;
import com.liferay.portal.kernel.events.SimpleAction;
public class StartupAction extends SimpleAction {
@Override
public void run(String[] companyIds) throws ActionException {
setupExpandoAction.run(companyIds);
importMessagesAction.run(companyIds);
}
private SetupExpandoAction setupExpandoAction = new SetupExpandoAction();
private ImportMessagesAction importMessagesAction = new ImportMessagesAction();
}
SetupExpandoAction 是:
package de.osc.kaleositeaddon.startup;
import com.liferay.portal.kernel.events.ActionException;
import com.liferay.portal.kernel.events.SimpleAction;
import com.liferay.portal.model.Group;
import com.liferay.portal.model.ResourceConstants;
import com.liferay.portal.model.Role;
import com.liferay.portal.model.RoleConstants;
import com.liferay.portal.security.permission.ActionKeys;
import com.liferay.portal.service.ResourcePermissionLocalServiceUtil;
import com.liferay.portal.service.RoleLocalServiceUtil;
import com.liferay.portlet.expando.DuplicateColumnNameException;
import com.liferay.portlet.expando.DuplicateTableNameException;
import com.liferay.portlet.expando.model.ExpandoColumn;
import com.liferay.portlet.expando.model.ExpandoColumnConstants;
import com.liferay.portlet.expando.model.ExpandoTable;
import com.liferay.portlet.expando.model.ExpandoTableConstants;
import com.liferay.portlet.expando.service.ExpandoColumnLocalServiceUtil;
import com.liferay.portlet.expando.service.ExpandoTableLocalServiceUtil;
import com.liferay.portlet.journal.model.JournalArticle;
import de.osc.kaleositeaddon.service.constants.ExpandoConstants;
public class SetupExpandoAction extends SimpleAction {
@Override
public void run(String[] companyIds) throws ActionException {
for (int i = 0; i < companyIds.length; i++) {
long companyId = Long.parseLong(companyIds[i]);
try {
setupExpandoGroup(companyId);
} catch (Exception e) {
e.printStackTrace();
}
}
}
protected void setupExpandoGroup(long companyId) throws Exception {
ExpandoTable table = null;
try {
table = ExpandoTableLocalServiceUtil.addTable(companyId, Group.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME);
} catch (DuplicateTableNameException dtne) {
table = ExpandoTableLocalServiceUtil.getTable(companyId, Group.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME);
}
/*
* Setup StartDate
*/
try {
ExpandoColumn column = ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(),
ExpandoConstants.EXPANDO_COLUMN_NAME_START_DATE, ExpandoColumnConstants.DATE);
column.setDefaultData("");
Role user = RoleLocalServiceUtil.getRole(companyId, RoleConstants.GUEST);
ResourcePermissionLocalServiceUtil.setResourcePermissions(companyId, ExpandoColumn.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL,
String.valueOf(column.getColumnId()), user.getRoleId(), new String[] { ActionKeys.VIEW});
}
catch (DuplicateColumnNameException dcne) {
}
/*
* Setup EndDate
*/
try {
ExpandoColumn column = ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(),
ExpandoConstants.EXPANDO_COLUMN_NAME_END_DATE, ExpandoColumnConstants.DATE);
column.setDefaultData("");
Role user = RoleLocalServiceUtil.getRole(companyId, RoleConstants.GUEST);
ResourcePermissionLocalServiceUtil.setResourcePermissions(companyId, ExpandoColumn.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL,
String.valueOf(column.getColumnId()), user.getRoleId(), new String[] { ActionKeys.VIEW});
}
catch (DuplicateColumnNameException dcne) {
}
try {
ExpandoColumn column = ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(),
ExpandoConstants.EXPANDO_COLUMN_NAME_CREATE_DATE, ExpandoColumnConstants.DATE);
column.setDefaultData("");
Role user = RoleLocalServiceUtil.getRole(companyId, RoleConstants.GUEST);
ResourcePermissionLocalServiceUtil.setResourcePermissions(companyId, ExpandoColumn.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL,
String.valueOf(column.getColumnId()), user.getRoleId(), new String[] { ActionKeys.VIEW});
}
catch (DuplicateColumnNameException dcne) {
}
}
}
在您的 liferay-hook.xml 文件中,您执行以下操作:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.0.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_0_0.dtd">
<hook>
<portal-properties>portal.properties</portal-properties>
</hook>
然后在 portal.properties 中添加这一行:
application.startup.events=de.osc.kaleositeaddon.startup.StartupAction
记得替换 class 个名字 ;)