Liferay

From Documentation


Setting up Liferay

There are several ways you can set up Lifetray, one is to goto Liferay and download the pre-bundled liferay tomcat bundled. This is the easiest method, but of course not ideal if you have a pre-existing tomcat server.

If you have a tomcat server already and don't particularly feel like deploying another one, you can download the liferay war. Liferay's installation typically removes the ROOT from the server, but I don't particularly like doing that so I'll explain with out having to loose your root

  • First, if you don't have tomcat, download and install the latest stable tomcat on the OS of your pleasure (you can try other app servers but experience has taught me other ones might be trickier to begin with as the configuration is usually more lengthy).
  • Next download the non-bundled liferay war (Liferay Portal Professional 4.2.1 WAR) from Liferay
  • Also download the additional file called Liferay Portal 4.2.1 Dependencies, and unzip it to shared/lib
  • In order to keep your ROOT you'll need to extract the contents of the war into a folder, call it 'myportal' fo instance.
  • Under the WEB-INF folder create a 'classes' folder, in this folder create a file called 'portal-ext.properties', in the file put the following (note you may of course change the portal.ctx and/or the lucene and jackrabbit directory depending on your later configurations):
portal.release=professional
portal.ctx=/myportal
auto.deploy.dest.dir=../webapps
portal.instances=1
lucene.dir=C:/home/liferay/lucene
jcr.jackrabbit.repository.root=C:/home/liferay/jackrabbit
omniadmin.users=
  • Go back into the WEB-INF folder and edit the web.xml change the root_path to have a param value of '/myportal', so the top of the web.xml will look as follows:
<?xml version="1.0"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
	<context-param>
		<param-name>company_id</param-name>
		<param-value>liferay.com</param-value>
	</context-param>
	<context-param>
		<param-name>root_path</param-name>
		<param-value>/myportal</param-value>
	</context-param>
	<filter>
		<filter-name>Auto Login Filter</filter-name>
		<filter-class>com.liferay.portal.servlet.filters.autologin.AutoLoginFilter</filter-class>
	</filter>
.
.
.
  • Now go into the META-INF folder and add a file called 'context.xml' and add the following (configure this to your own spefics just make sure the context path attribute is '/myportal', if you don't use mysql database and just want liferay to use hSQLdb, just strip out the first Resource element):
<Context path="/myportal" reloadable="true" >
    <Resource
        name="jdbc/LiferayPool"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="com.mysql.jdbc.Driver"
	  url="jdbc:mysql://localhost/lportal?useUnicode=true&amp;characterEncoding=UTF-8"
        username="liferay"
        password="yarefil"
        maxActive="100"
        maxIdle="30"
        maxWait="10000"
    />
    <Resource
                name="mail/MailSession"
                auth="Container"
                type="javax.mail.Session"
                mail.transport.protocol="smtp"
                mail.smtp.host="localhost"
    />
    <Realm 
                className="org.apache.catalina.realm.JAASRealm"
                appName="PortalRealm"
                userClassNames="com.liferay.portal.security.jaas.PortalPrincipal"
                roleClassNames="com.liferay.portal.security.jaas.PortalRole"
                debug="99"
                useContextClassLoader="false"
    />
</Context>
  • Now for the real trick, liferay 4.2 has a small bug when you change the context to something other than the ROOT. In the folder html/portal you will find a file called load_render_portlet.jsp, open the file up and go to line 55-56should look as follows:
	function <%= namespace %>loadPortlet() {
		var path = "/c/portal/render_portlet";

however it should look as follows:

	function <%= namespace %>loadPortlet() {
		var path = "/myportal/c/portal/render_portlet";

Ok I'm sure there is a better way of doing that, but I'd rather let the liferay boys do that themselves.

  • If you wish to use mySQL, you'll need to modify the context.xml to your own configurations, you'll also need to download the liferay-mysql script file and run it against your database.
  • Now on you root folder (i.e. C:\ for windows, / for UNIX/LINUX) you'll need to create a 'home' folder (if it doesn't exist) and in that a 'liferay' folder. Make sure tomcat has permission to modify the folder.
  • Now all you need do is re zip the folder and rename the zip file to myportal.war, drop it into tomcat's webapps deploy directory and (hopefully) you have a working liferay portal.

Deploying a ZK portlet

Here I'll assume you are familiar with and have created a ZK war.

  • First, you need to tell liferay about your portlet so create a class that looks like this:
/**
 * Copyright (c) 2000-2006 Liferay, LLC. All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package za.co.mypackage.portlet;

import java.io.IOException;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author  Brian Wing Shun Chan
 * @modified Glenn Keith
 */
public class JSPPortlet extends GenericPortlet {

	public void init() throws PortletException {
		editJSP = getInitParameter("edit-jsp");
		helpJSP = getInitParameter("help-jsp");
		viewJSP = getInitParameter("view-jsp");
	}

	public void doDispatch(RenderRequest req, RenderResponse res)
		throws IOException, PortletException {

		String jspPage = req.getParameter("jspPage");

		if (jspPage != null) {
			include(jspPage, req, res);
		}
		else {
			super.doDispatch(req, res);
		}
	}

	public void doEdit(RenderRequest req, RenderResponse res)
		throws IOException, PortletException {

		if (req.getPreferences() == null) {
			super.doEdit(req, res);
		}
		else {
			include(editJSP, req, res);
		}
	}

	public void doHelp(RenderRequest req, RenderResponse res)
		throws IOException, PortletException {

		include(helpJSP, req, res);
	}

	public void doView(RenderRequest req, RenderResponse res)
		throws IOException, PortletException {

		include(viewJSP, req, res);
	}

	protected void include(String path, RenderRequest req, RenderResponse res)
		throws IOException, PortletException {

		PortletRequestDispatcher prd =
			getPortletContext().getRequestDispatcher(path);

		if (prd == null) {
			_log.error(path + " is not a valid include");
		}
		else {
			prd.include(req, res);
		}
	}

	protected String editJSP;
	protected String helpJSP;
	protected String viewJSP;

	private static Log _log = LogFactory.getLog(JSPPortlet.class);

}
  • Next in your WEB-INF create a 'liferay-display.xml' file that looks as follows:
<?xml version="1.0"?>
<!DOCTYPE display PUBLIC "-//Liferay//DTD Display 4.0.0//EN" "http://www.liferay.com/dtd/liferay-display_4_0_0.dtd">

<display>
	<category name="category.test">
		<portlet id="portletone" />
	</category>
</display>
  • Now also in the WEB-INF create a file called 'liferay-portlet.xml' that looks as follows:
<?xml version="1.0"?>
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 4.1.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_4_1_0.dtd">

<liferay-portlet-app>
	<portlet>
		<portlet-name>portletone</portlet-name>
		<instanceable>true</instanceable>
	</portlet>
	<role-mapper>
		<role-name>administrator</role-name>
		<role-link>Administrator</role-link>
	</role-mapper>
	<role-mapper>
		<role-name>guest</role-name>
		<role-link>Guest</role-link>
	</role-mapper>
	<role-mapper>
		<role-name>power-user</role-name>
		<role-link>Power User</role-link>
	</role-mapper>
	<role-mapper>
		<role-name>user</role-name>
		<role-link>User</role-link>
	</role-mapper>
</liferay-portlet-app>
  • Liferay 5.2.* : Liferay 5.2 adds cache filters to your web.xml when you deploy on the liferay server. These will block the zk javascript (*.js) communication. To make it work you have to add the property "speed-filters-enabled=false" in the liferay-plugin-package.properties file in the WEB-INF directory.


  • Now again in WEB-INF create a 'portlet.xml' file that looks as follows:
<?xml version="1.0"?>

<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" version="1.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd">
	<portlet>
		<portlet-name>portletone</portlet-name>
		<display-name>Sample JSP Portlet</display-name>
		<portlet-class>za.co.mypackage.JSPPortlet</portlet-class>
		<init-param>
			<name>view-jsp</name>
			<value>/view.zul</value>
		</init-param>
		<expiration-cache>0</expiration-cache>
		<supports>
			<mime-type>text/html</mime-type>
		</supports>
		<portlet-info>
			<title>Sample JSP Portlet</title>
			<short-title>Sample JSP Portlet</short-title>
			<keywords>Sample JSP Portlet</keywords>
		</portlet-info>
		<security-role-ref>
			<role-name>guest</role-name>
		</security-role-ref>
		<security-role-ref>
			<role-name>power-user</role-name>
		</security-role-ref>
		<security-role-ref>
			<role-name>user</role-name>
		</security-role-ref>
	</portlet>
</portlet-app>
  • You'll note the /view.zul reference in this file is the 'index' file of the portlet, also note through out all these file I have referenced 'portletone', you'll need to change this to the name of your war.
  • Finally at the top of your web.xml file after <web-app> add the following (followed by the typical ZK stuff):
.
.
.
	<display-name>sample-jsp-portlet</display-name>
	<context-param>
		<param-name>company_id</param-name>
		<param-value>liferay.com</param-value>
	</context-param>
	<listener>
		<listener-class>com.liferay.portal.kernel.servlet.PortletContextListener</listener-class>
	</listener>
.
.
.

BJaouad

You'll notice I left the company_id as liferay.com. I've left it like this because changing the value also means digging around the liferay database, it's not that hard to find all the place to modify the value, so if you do, your on your own.

  • Deploy the resulting war into /home/liferay/deploy directory,
  • Access and sign in to your portal, click on 'Add Content' link, under the category 'Test' add 'Sample JSP Portlet'.

Hey presto, one portal with ZK portlet

Running ZK 5 with Liferay 5.2

Version: Liferay: 5.2.1 and ZK 5


Steps
1.Download Liferay bundled with Tomcat (we use liferay-portal-tomcat-6.0-5.2.1 here)
2.Create a ZK 5 Project

3. Inside WEB-INF folder, Liferay need four xml file for setting.

In order to integrate with ZK, pay attention to portlet.xml, we use setting:

  • <portlet-class>org.zkoss.zk.ui.http.DHtmlLayoutPortlet</portlet-class>
  • And create a zk_page called hello.zul
  • .hello.zul
<?xml version="1.0" encoding="UTF-8"?>
<?page title="Hello"?>
<zk>
<window title="My First window" border="normal" width="200px">
	Hello, World!
	<button label="Hi" onClick='alert("Welcome")'/>
</window>
</zk>
  • portlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<portlet-app version="1.0" xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd">
<portlet>
   <description xml:lang="EN">HelloZK</description>
   <portlet-name>HelloZK</portlet-name>
   <display-name xml:lang="EN">HelloZK</display-name>
   <portlet-class>org.zkoss.zk.ui.http.DHtmlLayoutPortlet</portlet-class>
   <expiration-cache>0</expiration-cache>
   <supports>
      <mime-type>text/html</mime-type>
      <portlet-mode>view</portlet-mode>
   </supports>
   <supported-locale>en</supported-locale>
   <portlet-info>
      <title>HelloZK Portlet</title>
      <short-title>HelloZK</short-title>
      <keywords>zk</keywords>
      </portlet-info>
   <portlet-preferences>
   <preference>
      <name>zk_page</name>
      <value>/hello.zul</value>
   </preference>
   </portlet-preferences>
   <security-role-ref>
      <role-name>power-user</role-name>
      </security-role-ref>
      <security-role-ref>
      <role-name>user</role-name>
      </security-role-ref>
   <security-role-ref>
      <role-name>administrator</role-name>
   </security-role-ref>
</portlet>
</portlet-app>
  • liferay-display.xml
<?xml version="1.0"?>
<!DOCTYPE display PUBLIC "-//Liferay//DTD DISPLAY 2.0.0//EN" "http://www.liferay.com/dtd/liferay-display_2_0_0.dtd">
<display>
<category name="category.sample">
	<portlet id="HelloZK" />
</category>
</display>
  • liferay-portlet.xml
<?xml version="1.0"?>
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 5.2.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_5_2_0.dtd">
<liferay-portlet-app>
   <portlet>
     <portlet-name>HelloZK</portlet-name>
     <header-portlet-javascript>/zkau/web/js/zk.wpd</header-portlet-javascript>
   </portlet>
   <role-mapper>
      <role-name>user</role-name>
      <role-link>User</role-link>
   </role-mapper>
   <role-mapper>
      <role-name>power-user</role-name>
      <role-link>Power User</role-link>
   </role-mapper>
   <role-mapper>
      <role-name>administrator</role-name>
      <role-link>Administrator</role-link>
   </role-mapper>
   </liferay-portlet-app>
  • liferay-plugin-package.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plugin-package PUBLIC "-//Liferay//DTD Plugin Package 4.3.6//EN" "http://www.liferay.com/dtd/liferay-plugin-package_4_3_0.dtd">
<plugin-package>
 <name>Hello ZK</name>
 <module-id>/com/demo/test/hellozk/war</module-id>
 <types>
  <type>portlet</type>
 </types>
 <tags>
	<tag>Hello ZK</tag>
 </tags>
 <short-description>
  Hello ZK
 </short-description>
 <change-log>
  Initial Deployment
 </change-log>

 <author>Sam</author>
 <licenses>
  <license osi-approved="true">GPL</license>
 </licenses>
 <liferay-versions>
  <liferay-version>5.1.1+</liferay-version>
  <liferay-version>5.2.1+</liferay-version>
 </liferay-versions>
</plugin-package>


4.Add library-property setting to zk.xml for Liferay

Reason: under IE, using Liferay with ZK will cause HTML Parsing Error (KB927917)
Solution: we could use jQueryPatch and set appropriate time delay value for browser.

  • zk.xml
<zk>
.
.
.
	<library-property>
		<name>org.zkoss.zk.portlet.PageRenderPatch.class</name>
		<value>org.zkoss.zkplus.liferay.JQueryRenderPatch</value>
	</library-property>
	<library-property>
		<name>org.zkoss.zkplus.liferary.jQueryPatch</name>
		<value>500</value>
	</library-property>
.
.
.
</zk>


5. Export war file
Export war file called DEPLOY_TO__HelloZK.war, and put this war file under deploy folder

In Liferay, it will deploy war file by it's name, when we use the name DEPLOY_TO__HelloZK.war, liferay will deploy this war file to folder HelloZK

Version History

Version Date Content
     



Last Update : 2011/08/03

Copyright © Potix Corporation. This article is licensed under GNU Free Documentation License.