Site icon Pro Liferay

Consume OSGI Service in Liferay Portlet

consume-osgi-service


We can easily Consume OSGI Service in Liferay Portlet. Before reading this article please read my previous article. This article is an extension of the previous article. In this article we will create a Sample Portlet and consume the OSGI Service which is explained in the previous article.


Read my previous article

Writing your first OSGI Service in Liferay 7


For creating OSGI based portlet in liferay 7 follow the below link

Liferay 7-OSGI Module – MVC Portlet by Maven


For this article the Portlet is created by below command

mvn archetype:generate
-DarchetypeGroupId=com.liferay
-DarchetypeArtifactId=com.liferay.project.templates.mvc.portlet
-DgroupId=com.proliferay
-DartifactId=com.proliferay.demo
-DinteractiveMode=false
-DclassName=ConsumeOsgiService

POM:

Please look into dependency section of the pom.xml. In the currebt POM, the previous artifact (i.e., the service creation) is added as dependency so that we can access SampleService.java in the current project.

<?xml version="1.0" encoding="UTF-8"?>

<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.proliferay</groupId>
	<artifactId>com.proliferay.demo</artifactId>
	<version>1.0-SNAPSHOT</version>
	<packaging>jar</packaging>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<dependencies>
		<dependency>
			<groupId>com.proliferay</groupId>
			<artifactId>com.proliferay.sample.osgi.service</artifactId>
			<version>1.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>com.liferay.portal</groupId>
			<artifactId>com.liferay.portal.kernel</artifactId>
			<version>2.0.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>com.liferay.portal</groupId>
			<artifactId>com.liferay.util.taglib</artifactId>
			<version>2.0.0</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>javax.servlet-api</artifactId>
			<version>3.0.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.compendium</artifactId>
			<version>5.0.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.core</artifactId>
			<version>6.0.0</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<version>2.6</version>
				<configuration>
					<archive>
						<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
					</archive>
					<excludes>
						<exclude>**/META-INF/resources/**/.sass-cache/</exclude>
					</excludes>
				</configuration>
			</plugin>
			<plugin>
				<groupId>biz.aQute.bnd</groupId>
				<artifactId>bnd-maven-plugin</artifactId>
				<version>3.2.0</version>
				<executions>
					<execution>
						<id>default-bnd-process</id>
						<goals>
							<goal>bnd-process</goal>
						</goals>
					</execution>
				</executions>
				<dependencies>
					<dependency>
						<groupId>biz.aQute.bnd</groupId>
						<artifactId>biz.aQute.bndlib</artifactId>
						<version>3.2.0</version>
					</dependency>
					<dependency>
						<groupId>com.liferay</groupId>
						<artifactId>com.liferay.ant.bnd</artifactId>
						<version>2.0.28</version>
					</dependency>
				</dependencies>
			</plugin>
			<plugin>
				<groupId>com.liferay</groupId>
				<artifactId>com.liferay.css.builder</artifactId>
				<version>1.0.20</version>
				<executions>
					<execution>
						<id>default-build-css</id>
						<phase>generate-sources</phase>
						<goals>
							<goal>build-css</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<portalCommonPath>/</portalCommonPath>
					<docrootDirName>src/main/resources</docrootDirName>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

Portlet Class:

package com.proliferay.portlet;

import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet;
import com.liferay.portal.kernel.util.ParamUtil;
import com.proliferay.service.SampleService;

import java.io.IOException;
import java.io.PrintWriter;

import javax.portlet.Portlet;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

@Component(immediate = true, property = { "com.liferay.portlet.display-category=category.sample",
		"com.liferay.portlet.instanceable=true", "javax.portlet.display-name=com.proliferay.demo Portlet",
		"javax.portlet.init-param.template-path=/", "javax.portlet.init-param.view-template=/view.jsp",
		"javax.portlet.resource-bundle=content.Language",
		"javax.portlet.security-role-ref=power-user,user" }, service = Portlet.class)
public class ConsumeOsgiServicePortlet extends MVCPortlet {

	@Override
	public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
			throws IOException, PortletException {

		super.doView(renderRequest, renderResponse);
	}

	@Override
	public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse)
			throws IOException, PortletException {

		int number1 = ParamUtil.getInteger(resourceRequest, "firstNumber", 0);
		int number2 = ParamUtil.getInteger(resourceRequest, "secondNumber", 0);
		int result = 0;
		if (_sampleService != null) {

			result = _sampleService.add(number1, number2);
			System.out.println("############Result###############" + result);
		}

		resourceResponse.setContentType("text/html");
		PrintWriter writer = resourceResponse.getWriter();
		writer.print(result);
		writer.flush();
		writer.close();
		super.serveResource(resourceRequest, resourceResponse);
	}

	@Reference
	public void set_sampleService(SampleService _sampleService) {
		this._sampleService = _sampleService;
	}

	private SampleService _sampleService;
}

Note 1: The Service is injected in the portlet class using @Reference annotation. The setter method is mandatory.
Note 2: At any point of time a service can be removed. So before using it check the null reference
Note 3: There is another way to discover OSGI Service using BundleContext

BundleContext bundleContext = FrameworkUtil.getBundle(ConsumeOsgiServicePortlet.class).getBundleContext();
		
ServiceReference ref = bundleContext.getServiceReference(SampleService.class.getName());
		
SampleService sampleService = (SampleService)bundleContext.getService(ref);
		
int result = sampleService.add(100, 200);

For the JSP download the source code and look the view.jsp.
Sample Output:

Note:

This portlet is dependent another service. So without deploying the service the portlet will not work as expected. 

Download Source Code:

com-proliferay-demo

Exit mobile version