Quartz Scheduler in Liferay


Today we will discuss about Schedular in Liferay. Sometime we have a situation in which we have to perform a task repeatedly after a certain period of time.Ex- Send a mail every week.

Liferay provide a simple way to achieve this.We create schedular class and provide entry of timing in liferay-portlet.xml. Time for schedular can be define by 3 ways:-

1)Using Liferay Feature

Ex-   <simple>
<simple-trigger-value>1</simple-trigger-value>
<time-unit>minute</time-unit>
</simple>  

Here in time unit we mention minute and in simple trigger value we mention 1 .This means this job run in each minute.

2)Using Property file

Ex- <cron>
<property-key>everyThirtySecond </property-key>
      </cron> 

We define key and cron expression in portlet.properties file like everyThirtySecond = 0/30 * * * * ?

3)Using Cron Expression Directly

Ex- <cron>
        <cron-trigger-value>0/15 * * * * ?</cron-trigger-value> 
       </cron>

This job runs in every 15 seconds.

Note:- For Cron Trigger Expression you may refer here.

So lets start this step by step:-


Step 1:-Create Liferay Project and Portlet
Inside eclipse IDE Click on File->New->Liferay plugin project and give the project name as schedular and click finish. After that Right Click on your project and click on New than click on Liferay Portlet. Provide class name as Demo and select MVCPortlet and click finish.

Note:-You can check the snapshots in my  blog on Portlet Configuration Page in Liferay.



Step 2:-Create Schedulars
Inside com.test package create 3 classes that implements MessageListener inteface and provide the definition of receive method.

FirstSchedular.java



SecondSchedular.java



ThirdSchedular.java



Step 3:-Provide timing in liferay-portlet.xml
Open liferay-portlet.xml and paste this:-


Explanation:-
Here we provide the entries of all 3 Schedulars.



Step 4:-Create portlet.properties
Inside docroot/WEB-INF/src create portlet.properties and paste this:-

everyThirtySecond = 0/30 * * * * ?

because second schedular take value from property file.





Step 5:-Check output
Deploy the portlet and add to page:-


Now check eclipse console




Project Structure









Hope this will Help....

You can Download Source code from  Schedular in Liferay.


Related Post:-

Send Redirect in Liferay


Today we will discuss how to redirect from a portlet to another portlet which are placed on some other page. For this we need two things:-

1)Portlet Layout Id(plid)
We need the plid of the page where we want to redirect.We can get the plid by the page name as:-



2)Portlet Name
We can get the Portlet name (on which we have to redirect) by clicking on wheel icon of portlet than go to look and feel and than click on advance Styling.




So lets start this step by step:-


Step 1:-Create Liferay Project and Portlet
Inside eclipse IDE Click on File->New->Liferay plugin project and give the project name as send-redirect and click finish. After that Right Click on your project ie send-redirect and click on New than click on Liferay Portlet. Provide class name as Demo and select MVCPortlet and click finish.

Note:-You can check the snapshots in my  blog on Portlet Configuration Page in Liferay.


Step 2:-Change view.jsp
Open view.jsp and paste this content:-


Explanation:-
Here we create a simple form on submit of form sendAction method is called inside controller.


Step 3:-Create Second Portlet
Right Click on project and click on New than click on Liferay Portlet.Give Portlet Name as Result and also change jsp name to result.jsp.


Step 4:-Deploy Result Portlet
Deploy the Result portlet and add to any page in my case i am adding this to a public page named about. Now get the Portlet name by going to look and Feel as discussed above. In my case the portlet name is result_WAR_sendredirectportlet.



Step 5:-Change Controller of Demo Portlet
Open Demo.java and Paste this Content:-


Explanation:-

  • Here first we get the plid and than create a URL and send redirect to another page using plid.
  • we also send a parameter so that this can be used in another portlet.
  • For more detail on LayoutLocalServiceUtil you may refer my blog add Portlet and Change Layout Programmatically.

Step 6:-Change result.jsp
Open result.jsp and paste this:-


Explanation:-
Here we just print the value that is set in Demo.java .



For Output


Now deploy both Demo and Result portlet and add Demo Portlet to welcome page and Result Portlet to about page .

When you click on submit it will redirect to Result Portlet which is placed on about page.


Project Structure



Hope this will Help....

You can Download Source code from  Send Redirect in Liferay.











Related Post:-

Inter Portlet Communication(IPC) in Liferay


Inter Portlet Communication ie IPC is needed when we have to communicate between two portlets. Some times these portlets are on same page sometimes they may be on different page. 

Example:- We have a drop down in one portlet by which we can select country name and another portlet display the currency, states, national flag, climate on the basis of country selected by first portlet. In this case we have to send value from first portlet to another.


We can achieve IPC by following ways:-

1)IPC using Portlet Session
IPC by Portlet session work for both scenario ie Sender and Receiver portlet are on same page or different page. You can read more in my blog IPC by Portlet Session.


2)IPC using Public Render Parameter
IPC by public render parameter work if both portlet are on same page. But by adding one property in portal-ext.properties:-

portlet.public.render.parameter.distribution=layout-set

You can add portlet on different page also.For more detail you can read IPC using Public Render parameter.


3)IPC using Events
Events is introduced in Portlet 2.0  by which you can do IPC in very easily. Here the two portlets are on same page only. For more details you may refer IPC using Events.


4)Client Side IPC
Liferay provide two methods one for Sender(Liferay.fire) and one for receiver(Liferay.on) by which you can achieve IPC. In this case portlets must be on same page. For More details you may read  Client Side IPC in Liferay.





Hope this will Help....


Related Post:-

Client Side Inter Portlet Communication in Liferay


Today we will discuss Client Side Inter Portlet Communication in Liferay . In my opinion it is the simplest way for sharing data between two portlets which are on same page. Liferay provide two basic methods for this:-

1)For Client

Liferay.fire('eventName',{
            parameter1: value1,
            parameter2: value2

    });

2)For Receiver

 Liferay.on('eventName',function(event) {
   var firstValue = event.parameter1,
   var  secondValue = event.parameter2

});

Note:- Their may be one sender and many receiver but sender and all the receiver are must be on the same page . 

We take a simple scenario where user can select food type from one portlet and second portlet shows food items on the basis of first portlet.Here we create two project and each project contain one portlet.

So lets start this step by step:-

For Sender

Step 1:-Create Liferay Project and Portlet
Inside eclipse IDE Click on File->New->Liferay plugin project and give the project name as client-side-sender and click finish. After that Right Click on your project and click on New than click on Liferay Portlet. Provide class and package name and select MVCPortlet and click finish.

Note:-You can check the snapshots in my  blog on Portlet Configuration Page in Liferay.



Step 2:-Change view.jsp 
Open view.jsp and paste this:-


Explanation:-

  • On click of button we fetch the value of selected radio button and set in foodType.
  • We give the eventName as selectedFoodType which is used to fetch the data in receiver.


Note:-Change <requires-namespaced-parameters> is false inside liferay-portlet.xml.






For Receiver

Step 1:-Create Liferay Project and Portlet
Similarly as in Sender Create project with name client-side-sender and create a portlet in it.



Step 2:-Change view.jsp
Open view.jsp and paste this:-



Explanation:-
Here we get the value from event and on the basis of input we show the output.


For Output


Now deploy both sender and receiver portlet and add to same page .



Now Select Vegetarian and click submit



Select Non-Vegetarian and click submit




Inter Portlet Communication (IPC) using Events in Liferay


We already know IPC using public render parameters  .Today we will see how to do IPC using Events. Events based IPC was introduced in JSR 286 or we can say in Portlet 2.0. According to this a new method processEvent introduced in Life Cycle of Portlet.Here one Portlet can Produce a event which can be consumed by other portlets.

We take a simple scenario where user can select food type from one portlet and second portlet shows food items on the basis of first portlet. This is a Sender, Receiver kind of scenario but for events there may be one sender and multiple receivers.Here we create two project and each project contain one portlet.

So lets start this step by step:-


For Sender

Step 1:-Create Liferay Project and Portlet
Inside eclipse IDE Click on File->New->Liferay plugin project and give the project name as event_sender and click finish. After that Right Click on your project ie event_sender and click on New than click on Liferay Portlet. Provide class and package name and select MVCPortlet and click finish.

Note:-You can check the snapshots in my  blog on Portlet Configuration Page in Liferay.


Step 2:-Change portlet.xml
Open portlet.xml and enter supported publishing event as:-


Explanation:-
Focus on these lines:-

<supported-publishing-event>
                <qname xmlns:food="http://aditya/events">                                                 food:foodType  
               </qname>
</supported-publishing-event>

Here Supported Publishing event tell that this portlet can generate event with name foodType. The Qualified name(qname) is used so that parameter name space properly to resolve conflict in case where portlet have two events with same name.



Step 3:-Change view.jsp
Open view.jsp and paste this content:-

Note:- We are not using namespaces, so set required namespace parameter property is false in liferay-portlet.xml.


Step 4:-Change the Controller
Open your Controller and paste this:- 



Explanation:-
Here we fetch the Qname from portlet.xml and produce a event.



For Receiver

Step 1:-Create Liferay Project and Portlet
Similarly as in Sender Create project with name event-receiver and create a portlet in it.


Step 2:-Change portlet.xml
Similarly as in Sender change  portlet.xml .After Security-role-ref tag paste this:-

<supported-processing-event>
     <qname xmlns:food="http://aditya/events">                                                 food:foodType
        </qname>
 </supported-processing-event>

Note:- In Sender we use supported publishing event but in receiver we use supported processing event.


Step 3:-Change the Controller
Open your Controller and paste this:-

Explanation:-
1)By using the annotation @ProcessEvent we can create method with any name otherwise we have to use default processEvent method.
2)Here First we get the event and than value from the event which is set by sender portlet .
3)Finally we set value in request so that it can be get in view.jsp


Step 4:-Change the jsp
Open view.jsp and paste this :-

Explanation:-
Here we get the value that is set in Controller and on the basis of condition show different messages.

Note:- We are using jstl tage here so provide entry in liferay-plugin-package.property file as:-






For Output


Now deploy both sender and receiver portlet and add to same page .



Now Select Vegetarian and click submit



Select Non-Vegetarian and click submit



Note:-Now if you want to add the portlet on different pages . Better you use session or Public render Parameters for IPC because when processEvent method completes in receiver it called doView.
So when portlet is on some other page and you click on navigation bar to change the page only doView of receiver portlet is called and not processEvent.

Inter Portlet Communication (IPC) using Public Render Parameter in Liferay


We already know that render Parameter set in processAction is available to render method of same portlet. But if we set render parameter in one portlet and want to get in another portlet . In this case we use Public Render Parameter so that parameter set in one portlet can be available to another Portlet.This feature is known as Inter Portlet Communication(IPC)  using Public Render Parameter.

We take a simple scenario where user can select food type from one portlet and second portlet shows food items on the basis of first portlet. This is a Sender, Receiver kind of scenario.Here we create two project and each project contain one portlet.

So lets start this step by step:-


For Sender

Step 1:-Create Liferay Project and Portlet
Inside eclipse IDE Click on File->New->Liferay plugin project and give the project name as prp_sender and click finish. After that Right Click on your project ie prp_sender and click on New than click on Liferay Portlet. Provide class and package name and select MVCPortlet and click finish.

Note:-You can check the snapshots in my  blog on Portlet Configuration Page in Liferay.

Step 2:-Change portlet.xml
Open portlet.xml and enter supported public render parameter tag and public render parameter tags :-

Explanation:-
Here we set two things:-

1)Tell Portlet that we are using public render parameter as:-
          
         <supported-public-render-parameter>
                            foodType
          </supported-public-render-parameter>

2)Use Qualified name(qname) so that parameter name-spaced properly to resolve conflicts.
          
         <public-render-parameter>
         <identifier>foodType</identifier>
                <qname xmlns:x="http://aditya/public">
                         x:foodTypeParam
                  </qname>
         </public-render-parameter>


Step 3:-Change view.jsp
Open view.jsp and paste this content:-


Note:- We are not using namespaces, so set required namespace parameter property is false in liferay-portlet.xml.

Step 4:-Change the Controller
Open your Controller and paste this:-

Explanation:-
Here we just fetch the value from jsp and set in render Parameter.


For Receiver

Step 1:-Create Liferay Project and Portlet
Similarly as in Sender Create project with name prp-receiver and create a portlet in it.


Step 2:-Change portlet.xml
Similarly as in Sender change  portlet.xml of Receiver as:-



Step 3:-Change the Controller
Open your Controller and paste this:-

Explanation:-
Here we get the value from render parameter and set in attribute so that we can use this on jsp.

Step 4:-Change the jsp
Open view.jsp and paste this :-


Explanation:-
Here we get the value that is set in Controller and on the basis of condition show different messages.

Note:- We are using jstl tage here so provide entry in liferay-plugin-package.property file as:-







For Output


Now deploy both sender and receiver portlet and add to same page .



Now Select Vegetarian and click submit



Select Non-Vegetarian and click submit



Note:-Now if you want to add the portlet on different pages .You need to provide a entry in portal-ext.properties as:-

portlet.public.render.parameter.distribution=layout-set








Hope this will Help....

You can Download Source code from  IPC using Public Render Parameter.

Related Post:-

Inter Portlet Communication (IPC) by Portlet Session in Liferay


Inter Portlet Communication can be done by many ways like by using events,public render parameters and Portlet Session. Today we discuss about IPC by using Portlet Sessions. Here we set some value in one portlet and get value in other Portlet.

We take a simple scenario where user can select food type from one portlet and second portlet shows food items on the basis of first portlet. This is a Sender, Receiver kind of scenario.Here we create two project and each project contain one portlet.

So lets start this step by step:-


For Sender

Step 1:-Create Liferay Project
Inside eclipse IDE Click on File->New->Liferay plugin project and give the project name as Session_Sender and click finish.

Step 2:-Create MVC Portlet inside project
Right Click on your project ie Session_Sender and click on New than click on Liferay Portlet. Provide class and package name and select MVCPortlet and click finish.

Note:-You can check the snapshots in my  blog on Portlet Configuration Page in Liferay.

Step 3:-Change liferay-portlet.xml
Open liferay-display.xml and set private session attribute to false so that attribute set in session available to different wars:-

<private-session-attributes>false</private-session-attributes>

Also we are not using AUI so set required namespace parameter to false:-

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

Now your liferay-portlet.xml become:-



Step 4:-Change view.jsp
Open view.jsp and paste this content:-


Explanation:-
Creating a simple form with two radio button on the submittion of form processFood method is called.


Step 5:-Change the Controller
Open your java class and paste this:-


Explanation:-
Here we fetch the value from form and set in Session Object with Application Scope so that it is available to whole application.We have one more Scope called Portlet scope.






For Receiver

Step 1:-Create Liferay Project
Inside eclipse IDE Click on File->New->Liferay plugin project and give the project name as Session_Receiver and click finish.

Step 2:-Create MVC Portlet inside project
Right Click on your project ie Session_Sender and click on New than click on Liferay Portlet. Provide class and package name and select MVCPortlet and click finish.

Note:-You can check the snapshots in my  blog on Portlet Configuration Page in Liferay.

Step 3:-Change liferay-portlet.xml
Open liferay-display.xml and set private session attribute to false as in Sender.

Step 4:-Change your Controller
Open your java class and paste this:-


Explanation:-
Here we fetch the value from session that is set by the Sender and again set in renderRequest so that it is available in view.jsp.


Step 5:-Change view.jsp
Open view.jsp of receiver as:-


Explanation:-
Here we get the value that is set in Controller and on the basis of condition show different messages.

Note:- We are using jstl tage here so provide entry in liferay-plugin-package.property file as:-





For Output


Now deploy both sender and receiver portlet and add to same page or different page. I am adding Sender on one page and Receiver on other.

Here i am adding Sender on Welcome page and select Vegetarian and click Submit:-


The Receiver Portlet is on about page:-



Now again go to and select Non- Vegetarian and click submit and see the Receiver as:-



Service Builder in Liferay


Service builder in Liferay provide a easy way to created services. We just need to provide the table structure in a xml file and all the CRUD methods generate automatically. For custom methods you may create Custom Sql  and Finder MethodsToday we create a basic services with just single table and see how to enter data in the table.

So lets start this step by step:-

Step 1:-Create Liferay Project
Inside eclipse IDE Click on File->New->Liferay plugin project and give the project name as service_demo and click finish.

Step 2:-Create MVC Portlet inside project
Right Click on your project ie service_demo and click on New than click on Liferay Portlet. Provide class and package name and select MVCPortlet and click finish.

Note:-You can check the snapshots in my  blog on Portlet Configuration Page in Liferay.

Step 3:-Create Service.xml
Right Click on your project ie service_demo and click on New than click on Liferay Service Builder. Provide the package path, namespaces and author



and Click Finish. This will create a service.xml inside WEB-INF.





Step 4:-Create Entity in Service.xml
Open Service.xml and Click overview and then click on entity.By using the "+" button you may enter as many entities as you want each entity represent one table in database.



Here we use Employee as name of the entity so all services is created with Employee as prefix. 

But we want the table name in database is employee_data .So Click on Employee on Left and fill Table as employee_data



So our table is created with name employee_data and our entity name is Employee.


Step 5:-Create columns in table
Click on columns on Left and by using the "+" button add columns



Here we check eid Primary checkbox so that eid become primary key for the table.

Now we want the primary key is auto incremented. So select eid from left, this will open property page for eid enter Id type to increment .



We have other options for Id type like sequence, identity, class but i am using Mysql so use increment.

Now all the columns in database will created with eid,name,phone ,age but i want that salary is created in database as EMP_SALARY so from Left click on salary and change Db name as:-



When you click on source you will see the service.xml as:-


We can directly create service.xml without using GUI. So you can directly copy paste service.xml and skip step 4 and 5.

Step 6:-Build Services
Click on overview in service.xml and click on Build service icon as:-



After build service is completed you can check all class are created in src folder.


Step 7:-Call the services 
Open your controller of the portlet ie java class and paste this:-



Explanation:-
Here in doView method we use CounterLocalServiceUtil to generate primary key ie eid because we take eid as autoincremented.

Step 8:-Check Output
Open your database you can see table as:-




Check data for that table




Project Structure








Hope this will Help....

You can Download Source code from  Service Builder in Liferay.

In the next blog Service Builder in Detail we will see each and every tag of service.xml in detail.

Related Post:-