Hook overview
- Hooks were introduced in Liferay 5.1 as an alternate developmentapproach to the Liferay Extension Environment.
- Hooks are a type of Liferay Plugin and were designed to be smallerin size than the Extension Environment and more modular.
- Hooks were also designed to be hot-deployable.
- Over the last several versions of Liferay, the capabilities of Hookshave been expanded and are generally preferred over working in the ExtensionEnvironment or the EXT Plugin whenever possible.
HOOKS ADVANTAGES
- Hot deployable
- Changes are made available as soon as they are deployed.
- Changes are removed as soon as they are undeployed.
- Useful as a light weight customization archive. Examples:
- Seven Cogs
- Social Office
- TweetRay
CUSTOMIZABLE ELEMENTS
- The following elements can be customized from a hook:
- Change the configuration
- Customize language keys
- Add or overwrite JSP files
- Indexer Post Processer
- Provide custom services implementations
- Override Struts Actions
CREATE TRAINING HOOK
- Go to File → New → LiferayProject.
- Project name: training
- Display name: Training Hook
- Select the SDK and Liferayruntime you have configured.
- Select the Hook plug-in type.
- Click Finish
LIFERAY-HOOK.XML
- At this point, we have created a Liferay Hook Plugin Project, but wehaven't actually created a Hook yet.
![]()
- Take a look at liferay-hook.xml, the descriptor of the hook.
- The liferay-hook.xml file is used to identify the types of hooks thatthis hook plugin will contain.
- To see a listing of the different types of hooks allowed, refer tohttp://www.liferay.com/dtd/liferay-hook_6_1_0.dtd.
- You can create different Hook Plugins for different purposes, or youcan combine several different Hooks into a single project.
- In this exercise, we will be adding several Hooks to a single HookPlugin project.
CUSTOMIZING PROPERTIES
- Ourfirst Hook will customize the portal.properties and implement a custompost-login action.
<?xml version="1.0"?> <!DOCTYPE hook PUBLIC "-//Liferay//DTDHook 6.1.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_1_0.dtd"> <hook> </hook>
- Not all the properties can be modified yet by a hook — there is a limited set defined in the DTD that are most popular and applicable.
- Default landing page, enable/disable public and private user pages, ...
- Events(Startup, service, login, logout...etc), model listeners...
- Simplevalues are overwritten.
- Listvalues are appended.
- Properties can be overwritten in the portal.properties file defined in liferay-hook.xml.
CUSTOMIZING PROPERTIES
- Liferay Portal provides a pluggable mechanism whereby you canregister classes that get fired on pre-login and post-login.
- Event classes are specified in portal.propertiesby overriding the following key values:
- login.events.pre
- login.events.post
- To create a cookie with login info, we’ll create an event class andappend the class name tologin.events.post.
CREATE CUSTOM POST LOGIN ACTION
- With the training-hookselected, click File → New → Liferay Hook.
- Hook plug-in project: traininghook
- Check the Portal propertiescheck box.
- Click Next.
- Accept the default path for the Portal properties file.
- Click the Add... button to Define actions to be executed on portal events.
- For Event: click Select... and choose login.events.post and clickOK.
- For Class: click New and enter:
- Classname: CreateCookieAction
- Java Package: com.liferay.training.events
- Click Create, then Ok, then Finish.
- Replace the content of CreateCookieAction.java with snippet 01-CreateCookieAction.java
- Save and deploy your hook.
- After login, you should see a line similar to the following in the console:
- Added TRAINING_COOKIE value to response:companyId=10160,userId=10202
package com.liferay.training.events; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.liferay.portal.kernel.events.Action; import com.liferay.portal.kernel.events.ActionException; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.util.PropsUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.util.PortalUtil; public class CreateCookieAction extends Action { public void run(HttpServletRequest req, HttpServletResponse res) throws ActionException { try { long companyId = PortalUtil.getCompanyId(req); long userId = PortalUtil.getUserId(req); String domain = PropsUtil.get("session.cookie.domain"); String cookieValue = "companyId=" + companyId + ",userId=" + userId; Cookie cookie = new Cookie("TRAINING_COOKIE", cookieValue); if (Validator.isNotNull(domain)) { cookie.setDomain(domain); } cookie.setPath(StringPool.SLASH); res.addCookie(cookie); System.out.println("Added TRAINING_COOKIE value to response: " + cookieValue); } catch (Exception e) { throw new ActionException(e); } } public static boolean isEncodedCookie(String name) { if (name.equals("ID") || name.equals("LOGIN") || name.equals("PASSWORD") || name.equals("SCREEN_NAME")) { return true; } else { return false; } } private static Log _log = LogFactoryUtil.getLog(CreateCookieAction.class); }
- You'l find that Liferay DeveloperStudio added one line into the portal.propertiesfile (docroot/WEB-INF/src):
- login.events.post=com.liferay.training.events.CreateCookieAction
- This is telling the portal to callthe CreateCookieAction when a user islogged in.