Hi guys:
this week I have been working in the Asset Importer, a portlet that reads a file (odt for the moment) and converts it into a web content so that you can publish your documents an your website.
We will use this to publish Liferay documentation in Liferay.com very soon
Developing this portlet I had to use for the first time a wrapper plugin. This is a variation of the hook plugin that allows you to extend core functionallity by creating a wrapper for a concrete core class... and there's no documentation at all, so that's why I'm writing this! :)
In my case I needed to do a few things everytime the user deletes a journal article, so here you have how I did it:
How to use Liferay's Wrapper Plugins
Note: I'll use a example that extends JournalArticle deletion to be more illustrative.
The steps to do to use this functionallity are the following:
Create a file called liferay-hook.xml with the following content and place it docroot/WEB-INF:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 5.2.5//EN" "http://www.liferay.com/dtd/liferay-hook_5_2_0.dtd">
<hook>
<service>
<service-type>com.liferay.portlet.journal.service.JournalArticleLocalService</service-type>
<service-impl>com.liferay.portlet.asset.service.impl.JournalArticleLocalServiceWrapperImpl</service-impl>
</service>
</hook>
The first class is the service you want to extend
The second class is the one that implements the modifications
Create a class that extends the wrapper you want to use and add the basic constructor (in my case it is JournalArticleLocalServiceWrapper):
public class JournalArticleLocalServiceWrapperImpl extends JournalArticleLocalServiceWrapper {
public JournalArticleLocalServiceWrapperImpl(JournalArticleLocalService journalArticleLocalService) {
super(journalArticleLocalService);
}
}
Add the methods you want to overwrite in that class:
public void deleteArticle(long groupId, java.lang.String articleId, double version,
java.lang.String articleURL, com.liferay.portal.service.ServiceContext serviceContext)
throws com.liferay.portal.PortalException, com.liferay.portal.SystemException {
[... all my custom code here...]
}
And that's all: you deploy your portlet/plugin and you'll see it in action!
By the way, you have a great example by Brian Chan in the test-hook-portlet
Regards
Juan Fernández
ps: I have created a
wiki page with this entry in the development section