Saturday, November 22, 2014

Liferay Plugins Development with MAVEN


Liferay Offers many ways to develop Plugin applications development we already much aware of Liferay IDE and ANT based plugins development



Liferay plugins development with MAVEN is also great choice for liferay developers.

What is MAVEN?

MAVEN is project build tool like ANT but its has more features than ANT when we build projects using MAVEN.

Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.


Each Maven project consist pom.xml in project root directory where we will defined project build process.

POM is project object model is one of the build process system which describes about software project and POM will be specified as xml tag notation in pom.xml file.

pom.xml is blueprint of the project and it describes your project’s directories, required plugins, build sequence, and dependencies. The POM is your project’s sole descriptive declaration. Once you create the pom.xml file and invoke the build process.

Entire project structure defined in pom.xml so that we can manage entire project from single point and it is easy when we compare with ANT because ANT build process will be defined in different build.xml files. MAVEN projects are very easy to understand by developers

Maven provides an easy way to share artifacts (e.g., JARs, WARs, etc.) across projects via public repositories.

Liferay plugins SDK provides project templates to build sample Plugin applications in the same way Liferay provides maven archetypes from which we can create different sample liferay plugins applications.

Archetypes are the template of project structure and it consist of all required configurations,its files and directory structure.

We can have different archetypes like spring archetypes,struts archetypes and web application archetypes from this we can create basic project structure from there we can start development.

Same way liferay also have created different archetypes for each Plugin type so that we can create basic Plugin projects very easy.

Liferay Plugin Development with MAVEN

The following are are the required steps

Install JAVA
Install MAVEN
Install Liferay Portal Server Bundle
Install Liferay MAVEN Archetypes
Download Eclipse+Liferay IDE
Create Liferay Plugin Maven Project from Liferay IDE

Install JAVA

Liferay Java based portal so first we need to install Java in our machine download JDK 1.6 or later version and install.

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.

Java Installation follow below link look into section “Install JDK and setting required environment variables (JAVA_HOME, path)


Install MAVEN

We are using MAVEN based project building so first we need install MAVEN in machine and we also need to set environment variable like MAVEN_HOME/M2_HOME and edit the path then append MAVEN bin path.

Install MAVEN in Windows.

Download latest version of MAVEN archive file from apache maven download site


Download Maven 3.2.3 (Binary zip) archive file from above link

Extract zip file in any of desired location assume we have extracted in C drive then our maven home path will be C:\apache-maven-3.2.3

Now need to add M2_HOME and MAVEN_HOME system variables in the Windows environment, and point it to your Maven folder (C:\apache-maven-3.2.3)

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

In the Advanced tab, click Environment Variables….

In the System variables section, click New

variable : M2_HOME

variable : MAVEN_HOME

Once we created two maven environment variables now we need to edit windows PATH variable then append Maven bin folder like ;%M2_HOME%\bin; so that you can run the Maven’s command everywhere.

In the System variables section, select your PATH variable and click Edit….

Append ;%M2_HOME%\bin; end of the existed path.

Now open windows command prompt then type following command then will shows maven version message otherwise there is problem in installation so need to recheck all steps.

mvn –version

Note:

semicolon in the path will separate the different path values so we should not forget to use semicolon.

Install MAVEN in Ubuntu

Open Ubuntu terminal

Run command sudo apt-get install maven, to install the latest Apache Maven.

It will take time to install all maven packages once it successfully done Run command mvn -version to verify your installation.

Manual Installation in Linux

Go apache MAVEN download site and download apache-maven-3.2.3-bin.tar.gz archive file


Extract in your desired location assume in opt directory then maven home path will be /opt/apache-maven-3.2.3

Now we need to configure maven environment variables in bash.bashrc or “/etc/profile”

bash.bashrc file will be available in /etc/bash.bashrc folder open in editor and add following configurations.

M2_HOME=/opt/apache-maven-3.2.3
PATH=$PATH:$M2_HOME/bin
export M2_HOME
export PATH

Run command mvn -version in the terminal to verify your installation

Install Liferay 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.

Assume we will use tomcat bundle so download liferay-portal-tomcat-6.2-ce-ga2.zip from above location.

Now extract zip file in of your desired location now we are ready with liferay portal tomcat server.

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 Liferay MAVEN Archetypes

We are developing plugins with maven so we need to install liferay maven archetypes. Liferay maven archetypes are like project templates consist all required configurations and its files.

Download Liferay Portal Maven archive file(liferay-portal-maven-6.2-ce-ga2.zip) from following location


Now extract file on any of your desired location now we need to install liferay maven archetypes.

To install maven archetypes first we need to install ANT tool in our machine because maven archetypes used ANT build mechanism that is why we should install ANT tool

Install maven archetypes is nothing but we will place all requires liferay maven plugins and jar files in the local maven repositories that is (${USER_HOME}/.m2/repository)

Install ANT

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 our machine.

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

Set ANT Environment Variable in Linux

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

Generally in the Linux we will use “.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=/opt/apache-ant-1.9.4
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; end of the existed path value 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.

Now we are ready with ANT tool

Now Install Liferay MAVEN Archetypes into Local Maven Repository(${USER_HOME}/.m2/repository)

Open command prompt/terminal based on your OS issue the following command
Navigate to liferay-portal-maven-6.2-ce-ga2 then issue following command

ant install

Console shows output from the artifacts being installed from the Liferay Maven package into your local repository, typically located in your ${USER_HOME}/.m2/repository directory. Local repository now contains the Liferay artifacts required to build Liferay plugins

Download Eclipse+Liferay IDE

Well as of now we are ready with MAVEN archetypes installed in maven local repository and Liferay Portal Server now we need a development IDE to create Liferay MAVEN Project.

Generally we need eclipse , Liferay IDE ,MAVEN Eclipse Plugin,Liferay IDE MAVEN Plugin.

The following are the required eclipse plugins to support Liferay MAVEN Environment in Eclipse.

m2e-core (Maven integration for Eclipse)
m2e-wtp (Maven integration for WTP)
m2e-liferay plugin

All together will be available in single package when we download Eclipse Liferay IDE from Liferay downloads.

Go through following link


Select Other download drop-down select Eclipse Luna + Liferay IDE 2.2.0-ga1 option based on your OS and its Bits

Now extract archive file in desired location then you can see root directory that is eclipse if you go to root directory then you can see eclipse icon when we double click on icon then eclipse will be started.

Create Liferay Plugin Maven Project from Liferay IDE

before start development now we will notice following things

Assume as follows

Create directory give name LiferayMaven in “/opt” then workspace path /opt/ LiferayMaven

Auto Deploy Directory: “/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/deploy ”

App Server Deploy Directory:”/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/tomcat-7.0.42/webapps ”

App Server Lib Global Directory:”/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/tomcat-7.0.42/lib/ext ”

App Server Portal Directory:”/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/tomcat-7.0.42/webapps/ROOT ”

Liferay Version: 6.2.1

Start eclipse and select LiferayMaven is default work space.

Configure Liferay Portal Run Time In Liferay IDE

Eclipse Window → Preferences → Server → Runtime Environments.

Click Add to add a new Liferay runtime; find Liferay v6.2 (Tomcat 7) under the Liferay, Inc. category and click Next.

Click Browse and select your liferay-portal-6.2.x/tomcat-7.x (/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/tomcat-7.0.42)directory.

Select Run Time JRE
Click Finish; you should see your Liferay portal runtime listed in Preferences → Server → Runtime Environments.
Click OK to save your runtime preferences

Create Liferay Plugin Maven Project

Go liferay IDE icon and Click on “Create New Liferay Plugin Project

Now it will launch Liferay Plugin Project Dialog window

Now fill all the fileds with appropriate values as follows

Project Name: liferay-sample-portlet

Project Display Name : Liferay Sample Portlet

Tick the check box “use default location” for Location

Build Type: Maven(liferay-maven-plugin)

Artifact version: keep default one

Gropuid: com.liferay.sample

Active Profile:

Click the icon “Create New Maven Profile Based on Liferay Run Time

it will open another dialog window ask information as follows
Liferay Run Time: Liferay v6.2 CE(Tomcat)
Liferay Version: 6.2.1
Check the profile location radio button as “project pom.xml

The following is Maven Profile Dialog


Then click on OK it will create maven profile with given values in project pom.xml

Now finally Liferay Plugin Project Dialog Look like as follows after fill all the thing



Now click on Next then you can move to next step there check the radio button Liferay MVC portlet then click on finish


Once we finish then it will prompt another Liferay Portlet dialog window and fill the details as follows

source folder: use default
check the Create New Portlet Radio button
Portlet class: you choice
Java Package : your choice
Super Class: MVC portlet


Once we provided the information click on finish button then Plugin portlet project will be created.

The following is created Liferay Maven Plugin Portlet Project




In the project explorer you can see the project and every maven project have one xml file called pom.xml file there all build process will be defined.

Now click on pom.xml file then you can see default all build configuration like plugins definitions, configuration and dependencies information.

Now do the following changes in project pom.xml file

Comment/remove following lines

<execution>
<phase>generate-sources</phase>
<goals>
<goal>build-css</goal>
</goals>
</execution>

Find the following configuration

<configuration>
<autoDeployDir>${liferay.auto.deploy.dir}</autoDeployDir>
<appServerDeployDir>${liferay.app.server.deploy.dir}</appServerDeployDir>
<appServerLibGlobalDir>${liferay.app.server.lib.global.dir}</appServerLibGlobalDir>
<appServerPortalDir>${liferay.app.server.portal.dir}</appServerPortalDir>
<liferayVersion>${liferay.version}</liferayVersion>
<pluginType>portlet</pluginType>
</configuration>

Now replace above configuration with below configuration

<configuration>
<autoDeployDir>/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/deploy</autoDeployDir>
<appServerDeployDir>/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/tomcat-7.0.42/webapps</appServerDeployDir>
<appServerLibGlobalDir>/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/tomcat-7.0.42/lib/ext</appServerLibGlobalDir>
<appServerPortalDir>/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/tomcat-7.0.42/webapps/ROOT</appServerPortalDir>
<liferayVersion>6.2.1</liferayVersion>
<pluginType>portlet</pluginType>
</configuration>

Note:

the above details are based on where your portal server resided.

find following tag and replace with version number

<version>${liferay.maven.plugin.version}</version>

Replace as

<version>6.2.1<version>

Change following tag in all dependencies from <version>${liferay.version}</version> to <version>6.2.1</version>

Add Other important liferay dependencies

<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-client</artifactId>
<version>6.2.1</version>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-impl</artifactId>
<version>6.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-pacl</artifactId>
<version>6.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-service</artifactId>
<version>6.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-web</artifactId>
<version>6.2.1</version>
<type>war</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-bridges</artifactId>
<version>6.2.1</version>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-java</artifactId>
<version>6.2.1</version>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-slf4j</artifactId>
<version>6.2.1</version>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-taglib</artifactId>
<version>6.2.1</version>
</dependency>

Note:

Above all dependencies should enclose by <dependencies></dependencies> tag.

Finally liferay Plugin portlet project pom.xml as follows

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.liferay.sample</groupId>
<artifactId>liferay-sample-portlet</artifactId>
<packaging>war</packaging>
<name>liferay-sample-portlet Portlet</name>
<version>1.0.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>com.liferay.maven.plugins</groupId>
<artifactId>liferay-maven-plugin</artifactId>
<version>6.2.1</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>build-css</goal>
</goals>
</execution>
</executions>
<configuration>
<autoDeployDir>/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/deploy</autoDeployDir>
<appServerDeployDir>/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/tomcat-7.0.42/webapps</appServerDeployDir>
<appServerLibGlobalDir>/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/tomcat-7.0.42/lib/ext</appServerLibGlobalDir>
<appServerPortalDir>/opt/LiferayMaven/liferay-portal-6.2-ce-ga2/tomcat-7.0.42/webapps/ROOT</appServerPortalDir>
<liferayVersion>6.2.1</liferayVersion>
<pluginType>portlet</pluginType>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-service</artifactId>
<version>6.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-bridges</artifactId>
<version>6.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-taglib</artifactId>
<version>6.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-java</artifactId>
<version>6.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.portlet</groupId>
<artifactId>portlet-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-client</artifactId>
<version>6.2.1</version>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-impl</artifactId>
<version>6.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-pacl</artifactId>
<version>6.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-service</artifactId>
<version>6.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-web</artifactId>
<version>6.2.1</version>
<type>war</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-bridges</artifactId>
<version>6.2.1</version>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-java</artifactId>
<version>6.2.1</version>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-slf4j</artifactId>
<version>6.2.1</version>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-taglib</artifactId>
<version>6.2.1</version>
</dependency>
</dependencies>
</project>

Now we have done all the required configuration in project pom.xml now we can deploy project.

Deploy Liferay Plugin Maven Project

Open command prompt or terminal and go to newly created liferay Plugin project location its generally in eclipse work space(LiferayMaven) then issue following command.

mvn package


once build was successful then issue following command to deploy into portal server

mvn liferay:deploy

now portlet will be deployed into portal and you can see build success message in the console


If portal already start then you can see Plugin deployment information in server log file.

Download sample liferay maven Plugin from below link when you use this project please make sure you should installed Liferay Maven Archetypes in your local and you have to change server configuration and versions information in the pom.xml file.

https://sourceforge.net/projects/meeralferay/files/SampleLiferayMaven/

The following pom.xml for liferay maven plugin portlet with liferay-portal-maven-6.2-ce-ga4

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.liferay.sample</groupId>
<artifactId>liferay-sample-portlet</artifactId>
<packaging>war</packaging>
<name>liferay-sample-portlet Portlet</name>
<version>1.0.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>com.liferay.maven.plugins</groupId>
<artifactId>liferay-maven-plugin</artifactId>
<version>${liferay.maven.plugin.version}</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>build-css</goal>
</goals>
</execution>
</executions>
<configuration>
<autoDeployDir>${liferay.auto.deploy.dir}</autoDeployDir>
<appServerDeployDir>${liferay.app.server.deploy.dir}</appServerDeployDir>
<appServerLibGlobalDir>${liferay.app.server.lib.global.dir}</appServerLibGlobalDir>
<appServerPortalDir>${liferay.app.server.portal.dir}</appServerPortalDir>
<liferayVersion>${liferay.version}</liferayVersion>
<pluginType>portlet</pluginType>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-service</artifactId>
<version>${liferay.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-bridges</artifactId>
<version>${liferay.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-taglib</artifactId>
<version>${liferay.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-java</artifactId>
<version>${liferay.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.portlet</groupId>
<artifactId>portlet-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>Liferay-v6.2-CE-(Tomcat-7)</id>
<properties>
<liferay.version>6.2.3</liferay.version>
<liferay.maven.plugin.version>6.2.2</liferay.maven.plugin.version>
<liferay.auto.deploy.dir>C:\MeerPrince\LiferayWorkSpace\bundles\deploy</liferay.auto.deploy.dir>
<liferay.app.server.deploy.dir>C:\MeerPrince\LiferayWorkSpace\bundles\tomcat-7.0.42\webapps</liferay.app.server.deploy.dir>
<liferay.app.server.lib.global.dir>C:\MeerPrince\LiferayWorkSpace\bundles\tomcat-7.0.42\lib\ext</liferay.app.server.lib.global.dir>
<liferay.app.server.portal.dir>C:\MeerPrince\LiferayWorkSpace\bundles\tomcat-7.0.42\webapps\ROOT</liferay.app.server.portal.dir>
</properties>
</profile>
</profiles>

</project>

Important Points

The configuration in pom.xml will be changed based on your environment like version number, server configuration and dependencies versions.

The above maven setup we have installed maven archetypes in our local repository that is /.m2/repository.

http://sourceforge.net/projects/lportal/files/Liferay%20Portal/6.2.1%20GA2/We have created liferay maven project from Liferay IDE tool without Liferay IDE also we can create liferay plugins from command prompt/terminal.

We have create Pluginv portlet project apart from that we can also create all liferay plugins like hook,web,ext,theme and layouttpl from liferay maven archetypes.

Author

0 comments :

Post a Comment

Recent Posts

Recent Posts Widget

Popular Posts