Thursday, November 20, 2014

Liferay Plugins Development with Plugins SDK+ANT Quick Notes


Liferay have given many options to develop liferay Plugin applications among that one of the developer choice is Liferay Plugins SDK with ANT tool.

Plugins SDK is liferay standard development Kit to develop liferay Plugin applications and its consist of all required to files and library files to develop liferay applications.

To start development with Plugins SDK we need ANT ,Liferay Portal Server Bundle,Plugins SDK and Text Editor

The following steps are required

Install JDK 1.6 or above version.
Install Portal Server Bundle
Install ANT
Install Plugins SDK
Plugins SDK Configuration
Create Plugin Applications with Liferay SDK

Install JDK 1.6 or above version

Liferay portal is Java based portal so first we need to install JDK .we need to set important environment variables such as JAVA_HOME and need to edit path system variable and add java bin path(;%JAVA_HOME%/bin;). We need Java 6.0 JRE or greater.

Install Portal Server Bundle

First we need to download portal server bundle based on developer choice. Once we downloaded bundle archive file then extract it in you desired location then you can see portal server bundle that consist application server with deployed liferay portal.


Liferay Portal Server is actual environment to run liferay Plugin applications. Liferay Portal Run time come up with different application servers such as tomcat,jboss,glashfish, jetty, geromino, JOnAS and resin.

Liferay provided these run time bundle with different server so that we can use any one based on developer choice.

Liferay Server Bundle Consist Application server and Deployed Liferay Portal Application. When we observed server deployment directory(for tomcat/webapps) we can see deployed Liferay Portal application with name ROOT.

Install ANT

Liferay Development need ANT tool to build and deploy applications. Plugins SDK developed using ANT scripts so that first we need to install ANT tool to start development.

Go to Apache ant site and download latest ANT (.zip archive: apache-ant-1.9.4-bin.zip)


Once you downloaded zip file extract in your desired location and we need to set ANT system environment variable in your machine.

We need to create ANT_HOME and we need to add ANT bin path in “path” environment variable.

Set ANT Environment Variable in Linux

Assume We have extracted ANT in the location “/java/apache-ant-1.9.4”
Now ANT_HOME is “/java/apache-ant-1.9.4” and ANT bin path is “$ ANT_HOME/bin”

Generally in the Linux we will use “.bash_profile” or “bash.bashrc” file to set all environment variables. Now open .bash_profile file in editor and add following configuration then save it.

export ANT_HOME=/java/apache-ant-<version>
export PATH=$PATH:$ANT_HOME/bin

Now open Linux Terminal type “ant -version” then it show ant version now you have successfully installed ANT.

Set ANT Environment Variable in Windows

Select Start, then right-select Computer --> Properties. 

In the Advanced tab, click Environment Variables.

In the System variables section, click New

Set the ANT_HOME variable:

Variable name: ANT_HOME
Variable value: [Ant installation path] (e.g., C:\apache-ant-[version])

Click OK. 

Also in the System variables section, select your path variable and click Edit….
Insert %ANT_HOME%\bin; after %JAVA_HOME%\bin; and click OK. 

Click OK to close all system property windows. 

Open a new command prompt “ant -version” then it show ant version now you have successfully installed ANT.

Plugins SDK Configuration

 

Plugins SDK Configuration are like portal server and other needed information,we need to specify in the “build.properties” file and the file consist with default configurations. This file is available in Plugins SDK root directory.

We need to edit this file with our configurations. But we should not edit “build.properties” instead of that we need to clone this file in same location and change name as “build.[username].properties”

Lets say system user name is “meeraprince” then properties file will be “build.meeraprince.properties”

The cloned “build.meeraprince.properties” already have default build configurations and we need to edit these configurations according to our local environment.

Edit this file and find the following lines and change the paths according to your settings.

app.server.type=[the name build.properties uses for your application server type]
app.server.parent.dir=[the directory containing your Liferay Server bundle]
app.server.tomcat.dir=[the directory containing your application server] 

Assume we are using Liferay Portal Tomcat Bundle and the bundle location is “D:/workspace/liferay-portal-6.2” folder then we need to specify the following lines in the properties file.

app.server.type=tomcat
app.server.parent.dir= D:/workspace/liferay-portal-6.2
app.server.tomcat.dir=${app.server.parent.dir}/tomcat-7.0.42 

app.server.parent.dir we can call it as Liferay Home Directory in our case “D:/workspace/liferay-portal-6.2” is Liferay Home Directory.

Plugins SDK consist many files ,required directories and these are required to develop plugins applications.

The following are the different files and required directories in Plugins SDK

Each directory in the Plugins SDK contains build xml file and command scripts for creating new plugins of that type. Here is the directory structure of the Plugins SDK.

liferay-plugins-<version>/ - Plugins SDK root directory. 

clients/ - client applications directory. 

dist/ -it consist of all plugins applications generated .war files 
 
ext/ - consist created “ext” plugins applications.

hooks/ - consist created hook plugin application 

layouttpl/ - consist created layout templates directory.

lib/ - commonly referenced libraries like all jar file required to development of plugins. 

misc/ - development configuration files. Example, a source code formatting specification file. 

portlets/ - consist created portlet plugins applications.

themes/ - consist created themes plugins directory.

tools/ - plugin templates and utilities to created basic Plugin application structure. 

webs/ - web plugins directory. 

build.properties - default SDK properties. 

build.<username>.properties - (optional) override SDK properties. 

build.xml – ANT build file consist all applications build information. 

build-common.xml - contains common targets and properties referenced throughout the SDK. 

build-common-plugin.xml - contains common targets and properties referenced by each plugin. 

build-common-plugins.xml - contains common targets and properties referenced by each plugin type. 

When we create Plugin applications then it will be created in respective directory which I specified above.Each created Plugin application consist “build.xml” file in project root directory and this “build.xml” file have other build files references to define build process.

Each plugins application consist different ANT targets to compile,package and deploy applications. We need to navigate to respective project root directory and need to invoke these targets then it will perform respective tasks on Plugin project.

When we run “ant deploy” target from Plugins SDK root directory then all Plugin applications will be deployed.

When we run “ant deploy” target from portlet directory then all Plugin portlets will be deployed same we can apply this for “ext,themes, layouttpl and hooks”.

The following are important ANT targets.

ant compile : Compile all java class files and make it as .class files in the Plugin applications.

ant clean : cleans the files created by the invocations of the compilation, archiving, and deployment targets.

ant deploy : this target deploy Plugin application means compile,package war file placed in deploy directory of server.

ant build-service : builds the service layer for a Plugin, using Liferay Service Builder.
ant war : its just packaged Plugin application as war file and placed in dist directory.

Note:

Generally ant targets are depends on other targets to complete the complex task. Lets say when we run “ant deploy” then its automatically invoke the ant compile and ant war targets to complete the deploy task.

Create Plugin Applications with Liferay SDK

Liferay Plugins SDK is providing command line user interface to create plugins projects. We already know tools directory consist of template and these commands will use templates and create basic plugins applications with required files,folders and its configurations.

Based on our Plugin type we need to navigate to respective directory form command prompt then need to execute project creation command and these commands are different for each Plugin type.

When you look into Plugin type directory such as portlets,themes,hooks,layouttpls,webs and ext then you can see two files such as “create.bat” and “create.sh”. When you open these files in text editor then you can find respective Plugin project creation command.

create.bat is for windows environment and we need to use this when we are working with Windows OS.

create.sh is for Linux environment and we need to use this when we are working with Linux OS.

Assume we want develop portlet plugin application then we need to navigate to portlet directory through the command prompt/Linux terminal from there we need to issue the portlet creation command.

On Linux and Mac OS X, enter 

./create.sh hello-world "Hello World" "mvc"

On Windows, enter 

create.bat hello-world "Hello World" "mvc"
   
The first hello-world is your portlet id. A new directory will be created based on the portlet id in the portlet directory.

The second "Hello World" is the portlet's display name. The quotation marks are only needed because there is a space in the display name.

A third value can be passed to specify the portlet framework to use. Valid values "jsf", "icefaces", "liferay_faces_alloy", "mvc", "primefaces", "richfaces", or "vaadin". The default value is "mvc". 
 
Now you can go to portlets directory( liferay-plugins-<version>/portlets) and open newly created portlet project then you can see all required files, folders and its configurations. Now open file in editor you can edit the files as for your need.Once we done with all editing of files then we need deploy plugin portlet using “and deploy” target.

Now go to newly created Plugin portlet project directory from command prompt then issue ant target that is “ant deploy” then portlet will be deployed in the portal server.

After successful deployment you can see message like portlet for hello-world-portlet is available for use. If not, double-check your configuration.

The same process you can apply for all other Plugin types such as themes,webs,hooks,ext and layouttpl.

Hooks

Linux OS
./create.sh hello-world "Hello World"

Windows OS
create.bat hello-world "Hello World"

Layouttpl

Linux OS
./create.sh hello-world "Hello World"

Windows OS
create.bat hello-world "Hello World"

Theme

Linux OS
./create.sh hello-world "Hello World"

Windows OS
create.bat hello-world "Hello World"

Whats is Plugins SDK?

Plugins SDK is liferay applications development kit consist of libraries,files and Plugin templates. with this we can create and develop liferay plugins.
Plugins SDK provided command bases user interface i.e. ANT command and its targets to create and develop liferay plugins. 

What is Portal Server Run Time?

Liferay Portal Run time is run time environment run liferay Plugin application and it consist of application server with deployed liferay portal along with HSQL database and one deployment directory i.e deploy.

Liferay Portal Run time come up with different Application server developer can choose any one among those(tomcat,jboss, glashfish, jetty,geromino, JOnAS and resin).

The portal run time available as bundle and no more configuration is required we can directly start server and access liferay portal.

What are the minimum Artifacts required for Liferay Application Development with Plugins SDK?

Liferay Portal Server Bundle
JRE/JDK
Liferay Plugins SDK
ANT
One Text Editor

Where we need to configure liferay server information?

We will use build.properties file available in Plugins SDK but we should not modify these properties so we need to clone build.properties file and change name as build.UserName.properties then modify the configurations

Can i modify build.properties file directly?

Yes you can modify but its not recommended process instead of that simply clone file in same location and change name as build.userName.properties

If suppose system user Name is meeraprince then what is the name of cloned properties file?

build.meeraprince.properties

What is server configuration in builld.userName.properties file for tomcat?

app.server.type = tomcat
app.server.parent.dir = /opt/LiferayWorkSpace62/bundles
app.server.tomcat.dir =${app.server.parent.dir}/tomcat-7.0.42
app.server.tomcat.deploy.dir =${app.server.parent.dir}/tomcat-7.0.42/webapps
app.server.tomcat.lib.global.dir =${app.server.parent.dir}/tomcat-7.0.42/lib/ext
app.server.tomcat.portal.dir =${app.server.parent.dir}/tomcat-7.0.42/webapps/ROOT

where is the hot/auto deployment directory?

The directory name is deploy which is available in liferay portal server run time bundle.
Example: liferay-portal-6.2-ce-ga2/deploy or bundles/deploy

Can i change hot deployment directory location?

Yes you can change but you need to configure in build.username.properties with below property.
app.server.parent.dir = /opt/WorkSpace/bundles
auto.deploy.dir = ${app.server.parent.dir}/deploy

What is app.server.parent.dir ?

app.server.parent.dir is directory where portal server available
example: in our case tomcat7.x server available in the directory WorkSpace/bundles
Note: these directory is your choice but make sure portal server should be available specifies location .please provides fully qualifies path.

What is Liferay Home?

Liferay Home directory and app.server.parent.dir are same where liferay portal servers are placed.

How can I change liferay database configurations?

Liferay Data base configurations are placed in portal-ext.properties file and this file should be placed on Liferay Home/ app.server.parent.dir directory.Liferay Support Many Databases so we can configure any one that specified by Liferay.

What are the databased supported by liferay?

db2,derby,hypersonic,ingres,mysql,oracle,postgresql,sqlserver,sybase

Suppose my database Mysql then how could configure in Liferay?

We need to configure Mysql database connection settings in portal-ext.properties with following properties and this file should be available in Liferay Home/ app.server.parent.dir directory.

# MySQL


jdbc.default.driverClassName=com.mysql.jdbc.Driver
jdbc.default.url=jdbc:mysql://localhost/lportal? useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
jdbc.default.username=
jdbc.default.password=

Note:

When we change database then we need to add respective jdbc implementation jar file in sever global lib directory. For MySQL we can find mysql.jar file. Fortunately liferay already added mysql.jar file in server global lib directory.

What is Server Global lib directory?

Server global lib directory consist of all jar files those are required by applications which are deployed in server. When we place any jar file in server global lib directory then it will be available to all applications. For tomcat tomcat-7.0.42/lib is server global lib directory.

What is liferay portal global lib directory?

Liferay portal global directory consist of all jar files which is used by liferay portal and all liferay deployed Plugin applications. If any library jar file placed in liferay global lib directory then it will be accessible to liferay portal and all Plugin applications. This directory name is ext which is sub directory of tomcat server lib directory that is /tomcat-7.0.42/lib/ext

If my data base then how can configure it in Liferay?

Liferay Data base configurations are placed in portal-ext.properties file and this file should be placed on Liferay Home/ app.server.parent.dir directory. The following are the Oracle Database connection properties.

# Oracle 
 
jdbc.default.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.default.url=jdbc:oracle:thin:@localhost:1521:xe
jdbc.default.username=lportal
jdbc.default.password=lporta
 
Here we need to add oracle jdbc implementation ojdbc6.jar file in server global lib directory

What is portal-setup-wizard.properties?

portal-setup-wizard.properties file is properties file this will be created when we start liferay portal for first time.
When we access liferay portal for first time we will get some configuration pages such as admin user registration and liferay database configurations and all these configuration will be stored in portal-setup-wizard.properties.

Where portal-setup-wizard.properties file will be created?

portal-setup-wizard.properties will be created in Liferay Home/ app.server.parent.dir directory
Example properites stored in portal-setup-wizard.properties

admin.email.from.name=Test Test
liferay.home=/opt/LiferayWorkSpace62/bundles
admin.email.from.address=test@liferay.com
setup.wizard.enabled=false

How many places can I configure liferay database connection details?

We can use portal-setup-wizard.properties or portal-ext.properties and make sure both should available Liferay Home/ app.server.parent.dir.
portal-setup-wizard.properties will created automatically by liferay when we access liferay portal first time and portal-ext.properties we need create to override existed portal properties.

Is this mandatory portal-ext.properties file should be in Liferay Home/ app.server.parent.dir directory?

No. We can also placed portal-ext.properties in portal classes directory i.e. /tomcat-7.0.42/webapps/ROOT/WEB-INF/classes.

But use Liferay Home/ app.server.parent.dir is best practice to place portal-ext.properties file.

If place portal-ext.properties all above three places then what could be the my configuration?

Liferay will finally read the properties from Liferay Home/ portal-ext.properties.

How does plugins are packaged?

All liferay plugins will be packaged as .WAR file and these war files places on dist directory it will be available in plugins SDK directory.

What is the ANT target to deploy liferay plugins?

We will use ant deploy target and its default target for each liferay Plugin application. We can also use ant direct-deploy too.

Where is application build process will be defined?

In plugins SDK we can find buid.xml file where all liferay Plugin application build process will be defined. This file available in Plugins SDK root directory.

Do i need to modify liferay plugins build file?

No. all build process defined by liferay we never get chance to change those file.

What is difference between ant war and ant deploy targets?

Ant war target do the job like compile and package Plugin application as .WAR file and places .war file dist directory.
 
Ant deploy target do the job like compile and package plugins application as .war file place .WAR file in dist directory in addition to that it will copy .WAR file into liferay portal deploy(${app.server.parent.dir}/deploy) directory so that it makes Plugin application available to deployment.
  
What is Plugin portlet creation command? 

On Linux and Mac OS
./create.sh hello-world "Hello World" "mvc"
On Windows
create.bat hello-world "Hello World" "mvc"

How many input option will take portlet creation command?

Three input options and third one is optional. The default option value is “mvc”

What are the valid inputs values for portlet create command third input option?

A third value can be passed to specify the portlet framework to use. Valid values "jsf", "icefaces", "liferay_faces_alloy", "mvc", "primefaces", "richfaces", or "vaadin". The default value is "mvc".

What are the create commands for theme,layouttpl,web,ext and hook?

Linux OS
./create.sh hello-world "Hello World"
Windows OS
create.bat hello-world "Hello World"
all are take only 2 input option for create command except portlet note it third input option always optional for portlet.

What are the main directories in Plugins SDK?

Clients,dist, ext, hooks, layouttpl, lib, misc, portlets, themes, tools and webs

What are build files available in Plugins SDK?

build.xml, build-common.xml, build-common-plugin.xml and build-common-plugins.xml


What are other important properties in build.properties file?
 
database.name=lportal
database.types=db2,derby,firebird,hypersonic,informix,ingres,interbase,jdatastore,mysql,oracle,postgresql,sap,sqlserver,sybase
#javac.compiler=modern
javac.compiler=org.eclipse.jdt.core.JDTCompilerAdapter
lp.version=6.2.0

Note:
any of build properties should be override by the build.[username].properties file and this file should be in Plugins SDK root directory.

Author

Tuesday, November 18, 2014

Liferay Requires Name Spaced Parameters


When we work with liferay 6.2 portlet development some time we may get null or empty values when we access request parameters or form input values in the portlet action class.

The reason is from Liferay 6.2 Portlet Action class only consider the request parameters which should append with portlet name space value. This is default behavior of Liferay 6.2 Portlet Action Class.

Example:

ParamUtil.getString(uploadPortletRequest, "paramName") ===> empty value
actionRequest.getParameter("paramName") ===> null

Same behavior you can see for renderRequst, resourceRequest objects too while accessing request parameters or form inputs in the portlet action class respective methods.

What is Portlet Name Space?

Portlet Name Space will give unique name to the elements in the page and these elements are associated to respective portlet. This will avoid name conflicts in the page.
We may use many portlets within one page and there may be chance to get name collision among elements in the page. portlet name space will avoid those name conflicts in the page.

Each portlet have its own portlet name space value so that we need to append these portlet name space value to each element in the portlet like HTML tag names or ids and we can use this for request parameters.

How can i get Portlet Namespace Value?

We can use following two ways

  1. Using <portlet:namespace/> Tag.
  2. Using renderResponse Object

Using <portlet:namespace/> Tag.

We can use <portlet:namespace/> Tag so that we can append portlet name space value for element names,ids and request parameters.

Note :
we need to import respective tag library in the jsp page to use above tag.

<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>

Example Code Snippets:

<input type="text" name="<portlet:namespace/>employeeName" id="<portlet:namespace/>employeeName"/>

<div id="<portlet:namespace/>testDiv">this is div</div>

Using renderResponse Object

We can also use renderResponse object to get portet Name space value. renderResponse is liferay implicit object and  these Objects will be available in JSP page.

We need to use following tag to get portlet implicit objects and it will be available to JSP page.

<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
<portlet:defineObjects />

Example Code Snippets:

<input type="text" name="<%=renderResponse.getNamespace()%>employeeName" id="<%=renderResponse.getNamespace()%>employeeName"/>
<div id="<%=renderResponse.getNamespace()%>testDiv">this is div</div>


To avoid name conflicts among portlets element names and ids its recommended portlet name space for each element.


Liferay Requires Namespaced Parameters

Liferay 6.2 we have to append portlet Name space for every name of input element i.e. form input elements or request parameters names otherwise portlet action class ignore the parameters which does not have portlet name space to names. Due to this we will get NULL/Empty values in the portlet action class when we get parameters values from request objects.

Solutions

We must Use Portlet Name Space Value for Every form Inputs/Request parameters

Use <requires-namespaced-parameters> tag value “false” in liferay-portlet.xml


We must Use Portlet Name Space Value for Every form Inputs/Request parameters

When use forms in development we must use portlet name space for each form inputs. We need append portlet name space value to form input name attribute.

Example Code Snippets:

<input type="text" name="<portlet:namespace/>employeeName" id="<portlet:namespace/>employeeName"/>

OR

<input type="text" name="<%=renderResponse.getNamespace()%>employeeName" id="<%=renderResponse.getNamespace()%>employeeName"/>

OR

<aui:input name="employeeName" id="employeeName" label="Emplyee Name"/>

Note:

When we use aui form tags then portlet name space will be appended automatically and we need not required to append explicitly.

Use Request Parameters in Ajax

When we want to send request data using Ajax then we have to append portlet name space value to each request parameter then only portlet action class consider those request parameters and we can access request parameter values.

Liferay AUI Ajax Call

AUI().use('aui-base','aui-io-request', function(A){
//aui ajax call to get updated content
A.io.request('<%=updaContentURL%>',{
dataType: 'json',
method: 'GET',
data: {
<portlet:namespace/>employeeName:employeeName,
<%=renderResponse.getNamespace()%>employeeId:employeeId
},
on: {
success: function() {
// response data will be received here
}
}
});
});

jQuery Ajax Call

$(document).on('ready',function(){
//jquey aja methos to call server side content
$.ajax({
url: '<%=updaContentURL%>',
dataType: "json",
data:{
<portlet:namespace/>employeeName:employeeName,
<%=renderResponse.getNamespace()%>employeeId:employeeId
},
type: "get",
success: function(data){
//here response data will come and we need to update in the page.
},
beforeSend: function(){
// it will execute before Ajax call start
},
complete: function(){
// this method will execute after success method is completed.
},
error: function(){
}
});
});


Use '<requires-namespaced-parameters>' tag value “false” in liferay-portlet.xml

Instead of adding portlet name space value to each request parameters we can make false value to <requires-namespaced-parameters> in liferay-portlet.xml then portlet action class consider request parameters even it don't have portlet name space.

The following configuration we need to do in liferay-portlet.xml file

<requires-namespaced-parameters>false</requires-namespaced-parameters>


Finally you can access form inputs or request parameters in portlet action class so that we can get values

ParamUtil.getString(actionRequest, "paramName") ===>Some Value
actionRequest.getParameter("paramName") ===> Some Value

ParamUtil.getString(renderRequest, "paramName") ===>Some Value
renderRequest.getParameter("paramName") ===> Some Value

ParamUtil.getString(resourceRequest, "paramName") ===>Some Value
resourceRequest.getParameter("paramName") ===> Some Value

Author

Recent Posts

Recent Posts Widget

Popular Posts