SlideShare a Scribd company logo
Liferay (DXP) 7 Tech Meetup for Developers
OSGi Overview
Portlets as Modules
Services as Modules
Extending Liferay DXP
What
Why
How
Why OSGi
Benefits of OSGi
• Reduced complexity
• Reuse
• Easy deployment
• Dyanmic updates
What is OSGi
What is OSGi
OSGi (Open Service Gateway Initiative) is a Java framework for
developing and deploying modular software programs and
libraries. Each bundle is a tightly coupled, dynamically loadable
collection of classes, jars, and configuration files that explicitly
declare their external dependencies (if any).
How OSGi Works
Application / Bundles
Operating System
Hardware
JVM
Modules
Life cycle
Service Registry
Services
Security
How OSGi Works
How OSGi Works
• Bundle
• Bundle fragments
• Bundle context
Sample Config. of bundle
Manifest-Version: 1.0
Bundle-Name: SimpleTestBundle
Bundle-Activator: SimpleTestActivator
Bundle-SymbolicName: SimpleTestBundle
Bundle-Version: 1.0.0
Import-Package: org.azilen.framework;
version=”1.3.1”
How OSGi Works
• Bundles - static entities
• Services - dynamics in OSGi
– Can appear, disappear at runtime according to a
condition
• Service
– Object, registered by a bundle
• BundleContext.registerService(iface,
implementation, properties);
OSGi in Liferay
• Blade
– JAVA Package manager
– jpm install -f
https://releases.liferay.com/tools/blade-
cli/latest/blade.jar
• Liferay workspace with Blade
– blade init [WORKSPACE_NAME]
OSGi in Liferay
OSGi Overview
Portlets as Modules
Services as Modules
Extending Liferay DXP
Portlets as Modules
Modules as Portlets
MVC Portlet
Customize Portlet Configuration
Portlet Provider Template
MVC Portlet
• Create portlet structure using blade
– blade create -t mvc-portlet -p
com.azilen.app.mvcportlet -c
SampleMvcPortlet sample-mvc-portlet-
project
MVC Portlet
MVC Action Command
@Component(
immediate = true,
property = {
"javax.portlet.name=com_azilen_liferay_portlet_SampleMVCPortlet",
"mvc.command.name=actionCommand1",
"mvc.command.name=actionCommand2"
},
service = MVCActionCommand.class
)
public class DemoMVCActionCommand extends BaseMVCActionCommand {
@Override
protected void doProcessAction(ActionRequest req,
ActionResponse res) throws Exception {
}
}
MVC Portlet
@Component(
immediate = true,
property = {
"javax.portlet.name=com_azilen_liferay_portlet_SampleMVCPortlet",
"mvc.command.name=renderCommand1",
"mvc.command.name=renderCommand2"
},
service = MVCRenderCommand.class
)
public class DemoRenderCommand implements MVCRenderCommand {
@Override
public String render(RenderRequest req, RenderResponse res)
throws PortletException {
}
}
MVC Render Command
MVC Portlet
MVC Resource Command
@Component(
immediate = true,
property = {
"javax.portlet.name=com_azilen_liferay_portlet_SampleMVCPortlet",
"mvc.command.name=ajax1",
},
service = MVCResourceCommand.class
)
public class DemoMVCResourceCommand extends BaseMVCResourceCommand {
@Override
protected void doServeResource(ResourceRequest res, ResourceResponse
res) throws Exception {
}
}
Customize Portlet Configuration
Create an interface to represent your config.
@Meta.OCD(id = "com.azilen.liferay.config.ChartConfig")
public interface ChartConfig {
public static final String FIELD_CHART_TITLE =
"chartTitle";
@Meta.AD(required = false)
public String getChartTitle();
}
Customize Portlet Configuration
Implement your configuration action class and
add a reference to your configuration
@Component(
configurationPid = "com.azilen.liferay.config.ChartConfig",
configurationPolicy = ConfigurationPolicy.OPTIONAL,
immediate = true,
property = {
"javax.portlet.name=com_azilen_liferay_portlet_DemoConfigurationScreen
Portlet"
},
service = ConfigurationAction.class
)
public class ChartConfigAction extends DefaultConfigurationAction {
}
Customize Portlet Configuration
• Implement the user interface for configuring
your application
• -metatype: * in project bnd.bnd file
– generate an XML configuration file
Portlet Provider Template
• Provide mechanism to customize existing
entity behavior.
– Portlet should be added in hidden category.
• Create a Java class
– Extend BasePortletProvider class
– Implement the appropriate portlet provider
interface
– e.g.
AddPortletProvider,ViewPortletProvider,
BrowsePortletProvider.
Portlet Provider Template
• Naming conventions
– Make sure that class name has suffix
PortletProvider
• To override the default portlet with a custom
portlet
– Assign your portlet a higher service ranking.
– Add in @Component declaration
• property=
{"service.ranking:Integer=Integer.MAX
_VALUE"}
Portlet Provider Template
Specify the methods you’d like to implement
@Component(
property = {
"mod-
el.class.name=com.liferay.document.library.kernel.model.DLF
ileEntry",
"service.ranking:Integer=" + Integer.MAX_VALUE
},
service = AddPortletProvider.class
)
public class ProviderTemplateAddPortletProvider
extends BasePortletProvider
implements AddPortletProvider {
}
OSGi Overview
Portlets as Modules
Services as Modules
Extending Liferay DXP
Services as modules
Using Service Builder
Creating Service Wrappers
OSGi Services
Using Service Builder
• To create service builder modules :
– blade create -t service-builder [-p
packageName] projectName
e.g.
blade create -t service-builder -p
com.azilen.service.book book
– Above command will create two modules :
book-api and book-service.
• To run service builder:
– blade gw buildService
Using Service Builder
• Things Unchanged:
– service.xml
– Custom SQL
– Dynamic Query
– Finder methods
– Model Hints
– Adding new methods into EntityServiceImpl, EntityLocalServiceImpl,
EntityImpl
Using Service Builder
• Using service objects in portlet
– @Reference
– OSGi Injection
public class BookPortlet extends MVCPortlet {
private BookLocalService bookLocalService;
@Reference
public void setBookLocalService(BookLocalService bookLocalService) {
this.bookLocalService = bookLocalService;
}
…
}
Creating Service Wrappers
• Override Liferay’s OOTB services
• Service wrapper hooks in LR 6.2.
• To create service wrapper module :
– blade create -t service-wrapper [-p
packageName] [-c className]
[-s serviceWrapperToExtend] projectName
– e.g.
blade create -t service-wrapper
-p com.azilen.serviceoverride
-c CustomUserLocalService -s
com.liferay.portal.kernel.service.UserLocalServ
iceWrapper service-override
Creating Service Wrappers
@Component(
immediate = true,
property = {
},
service = ServiceWrapper.class
)
public class CustomUserLocalService extends UserLocalServiceWrapper {
private static final Log _log =
LogFactoryUtil.getLog(CustomUserLocalService.class);
public CustomUserLocalService() {
super(null);
}
}
Creating Service Wrappers
• Override methods as required.
@Override
public int authenticateByEmailAddress(long companyId, String emailAddress,
String password, Map<String, String[]> headerMap, Map<String,
String[]> parameterMap, Map<String, Object> resultsMap)
throws PortalException {
// Custom logic
_log.info("Custom Implementation of authenticateByEmailAddress()");
// Calling Liferay's default implementation of service
return super.authenticateByEmailAddress(companyId, emailAddress,
password, headerMap, parameterMap, resultsMap);
}
OSGi services
• OSGi Services can be registered with Activator
public class CalcServiceActivator implements BundleActivator {
private ServiceRegistration<CalcService> reg;
@Override
public void start(BundleContext bundleContext) throws Exception {
reg = bundleContext.registerService(CalcService.class, new
CalcServiceImpl(), null);
}
@Override
public void stop(BundleContext bundleContext) throws Exception {
reg.unregister();
}
}
OSGi services
• Injecting OSGi Services in portlets
• Null check before using service object
public class CalcPortlet extends MVCPortlet {
private CalcService _calcService;
@Reference
public void setCalcService(CalcService calcService) {
this._calcService = calcService;
}
…
}
OSGi Overview
Portlets as Modules
Services as Modules
Extending Liferay DXP
Extending Liferay DXP
Fragments
• Extension of host module
• Uses same classloader as host module
• Extending out of box modules based on
requirements
• Earlier versions used Hook plugins
• Create a Liferay fragment
– blade create -t fragment [-h
hostBundleName] [-H hostBundleVersion]
projectName
Customize Existing JSP
Override Language properties
Add Servlet Filter
Add Custom event
Customize Existing JSP
• Override Liferay Login module
– blade create -t fragment -h
com.liferay.login.web -H 1.0.7 login-
fragment-module
• Find host module symbolic name and version
– Connect to gogo shell using
• telnet localhost 11311
– 219 ACTIVE com.liferay.login.web_1.0.7
Customizing existing JSP
• copy jsp from Liferay-
src/modules/apps/foundation/login/login-
web/src/main/resources/META-
INF/resources/login.jsp
and paste it in login-fragment-
src/main/resources/META-INF/resources/.
Override Language Properties
• Want to change Login portlet authentication
failed message
– authentication-failed key
• blade create -t mvc-portlet -p
com.azilen.fragment.language -c
CustomLanguageComponent language-
fragment-module
Override Language Properties
@Component(
property = { "language.id=en_US" },
service = ResourceBundle.class
)
public class CustomLanguageComponent extends ResourceBundle {
ResourceBundle bundle = ResourceBundle.getBundle("content.Language",
UTF8Control.INSTANCE);
@Override
protected Object handleGetObject(String key) {
return bundle.getObject(key);
}
@Override
public Enumeration<String> getKeys() {
return bundle.getKeys();
}
}
Override Language Properties
• Create Language_en.properties under
/language-fragment-
module/src/main/resources/content
• Add authentication-failed language key with
custom message.
– authentication-failed=Authentication
failed. Make sure you entered correct
username and password.
Add Servlet Filter
• Used for intercepting http request
• Extend BaseFilter class
• e.g. Intercept every request and print log
Add Servlet Filter
@Component(
immediate = true,
property = {
"dispatcher=REQUEST", "dispatcher=FORWARD",
"servlet-context-name=",
"servlet-filter-name=Custom Filter",
"url-pattern=/*"
},
service = Filter.class
)
public class CustomFilter extends BaseFilter {
private static final Log _log = LogFactoryUtil.getLog(CustomFilter.class);
@Override
protected void processFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws Exception {
_log.info("Intercepted request : " + request);
filterChain.doFilter(request, response);
}
}
Add Custom Event
• com.liferay.portal.kernel.events.Lif
ecycleAction is one of the extension points
that can be leveraged by service template
• Create a new module using “service” template
– e.g., blade create –t service –p
com.azilen.training.lifecycle.loginpost
action –c CustomLoginPostAction –s
com.liferay.portal.kernel.events.Lifecy
cleAction login-post-action
Add Custom Event@Component(
property = {
"key=login.events.post"
},
service = LifecycleAction.class
)
public class CustomLoginPostAction implements LifecycleAction {
private static final Log _log =
LogFactoryUtil.getLog(CustomLoginPostAction.class);
@Override
public void processLifecycleEvent(LifecycleEvent lifecycleEvent)
throws ActionException {
HttpServletRequest request = lifecycleEvent.getRequest();
User user = null;
try {
user = PortalUtil.getUser(request);
} catch (PortalException e) {
_log.error(e);
}
…
}
}
Add Custom Event
• Apart from this lifecycle event, there are many
other such portal lifecycle events supported
like:
login.events.post,
logout.events.post,
logout.events.pre,
global.shutdown.events,
global.startup.events,
application.shutdown.events,
application.startup.events
OSGi Overview
Portlets as Modules
Services as Modules
Extending Liferay DXP
Thank You
Q&A
@AzilenTech #AzilenTechMeetup
www.azilen.com/kb/liferay-dxp/

More Related Content

PPTX
Step by step guide to create theme for liferay dxp 7
PDF
Moved to https://slidr.io/azzazzel/leveraging-osgi-to-create-extensible-plugi...
PPT
ODP
Liferay Module Framework
PPT
Developing modular Java applications
PPTX
Modular Java
PPTX
Java modularization
KEY
Beyond OSGi Software Architecture
Step by step guide to create theme for liferay dxp 7
Moved to https://slidr.io/azzazzel/leveraging-osgi-to-create-extensible-plugi...
Liferay Module Framework
Developing modular Java applications
Modular Java
Java modularization
Beyond OSGi Software Architecture

What's hot (20)

PDF
Benefits of OSGi in Practise
PDF
OSGi and Java EE: A Hybrid Approach to Enterprise Java Application Development
PDF
OSGi and Java EE in GlassFish - Tech Days 2010 India
PPTX
Project Presentation on Advance Java
PDF
Open Services Gateway Initiative (OSGI)
PPTX
Java Modularity with OSGi
PPT
Java & J2EE Struts with Hibernate Framework
PDF
Java modularity: life after Java 9
PDF
Liferay portals in real projects
PPTX
Advance java Online Training in Hyderabad
PDF
108 advancedjava
PDF
MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
PPTX
Getting Started with Java EE 7
ZIP
Practical OSGi
PPTX
Workshop Framework(J2EE/OSGi/RCP)
PDF
Glassfish An Introduction
PDF
Desiging for Modularity with Java 9
ODP
GlassFish v3 - Architecture
KEY
Modularization in java 8
PPTX
Introduction to Spring Framework
Benefits of OSGi in Practise
OSGi and Java EE: A Hybrid Approach to Enterprise Java Application Development
OSGi and Java EE in GlassFish - Tech Days 2010 India
Project Presentation on Advance Java
Open Services Gateway Initiative (OSGI)
Java Modularity with OSGi
Java & J2EE Struts with Hibernate Framework
Java modularity: life after Java 9
Liferay portals in real projects
Advance java Online Training in Hyderabad
108 advancedjava
MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
Getting Started with Java EE 7
Practical OSGi
Workshop Framework(J2EE/OSGi/RCP)
Glassfish An Introduction
Desiging for Modularity with Java 9
GlassFish v3 - Architecture
Modularization in java 8
Introduction to Spring Framework
Ad

Similar to Liferay (DXP) 7 Tech Meetup for Developers (20)

PDF
WebNet Conference 2012 - Designing complex applications using html5 and knock...
PPT
jclouds overview
PDF
Connect + Docker + AWS = Bitbucket Pipelines
PPT
Gwt and rpc use 2007 1
PDF
Dependencies, dependencies, dependencies
ODP
Developing Microservices using Spring - Beginner's Guide
PDF
Apache Cayenne for WO Devs
PPTX
PPTX
MVC 6 - the new unified Web programming model
PPT
Intro lift
PDF
Microservices and modularity with java
PDF
What's new in the OSGi Enterprise Release 5.0
PDF
Field injection, type safe configuration, and more new goodies in Declarative...
ODP
Groovy & Grails eXchange 2012 vert.x presentation
PPTX
Petro Gordiievych "From Java 9 to Java 12"
PPTX
ZZ BC#7 asp.net mvc practice and guideline by NineMvp
ODP
Knolx session
PDF
Web Components v1
PDF
Java 23 and Beyond - A Roadmap Of Innovations
PPTX
ZZ BC#7.5 asp.net mvc practice and guideline refresh!
WebNet Conference 2012 - Designing complex applications using html5 and knock...
jclouds overview
Connect + Docker + AWS = Bitbucket Pipelines
Gwt and rpc use 2007 1
Dependencies, dependencies, dependencies
Developing Microservices using Spring - Beginner's Guide
Apache Cayenne for WO Devs
MVC 6 - the new unified Web programming model
Intro lift
Microservices and modularity with java
What's new in the OSGi Enterprise Release 5.0
Field injection, type safe configuration, and more new goodies in Declarative...
Groovy & Grails eXchange 2012 vert.x presentation
Petro Gordiievych "From Java 9 to Java 12"
ZZ BC#7 asp.net mvc practice and guideline by NineMvp
Knolx session
Web Components v1
Java 23 and Beyond - A Roadmap Of Innovations
ZZ BC#7.5 asp.net mvc practice and guideline refresh!
Ad

More from Azilen Technologies Pvt. Ltd. (20)

PDF
Software Product Development for Startups.pdf
PPTX
How Chatbots Empower Healthcare Ecosystem?
PPTX
[Step by-step guide] configure document generation functionality in ms dynami...
PPTX
How to overcome operational challenges in getting consistent beacon behavior
PPTX
Liferay dxp – the good, the bad and the ugly
PPTX
Realm mobile platform – explore real time data synchronization capabilities
PPTX
A step by step guide to develop temperature sensor io t application using ibm...
PPTX
How to create an angular 2.0 application in liferay dxp to fetch the ootb adv...
PPTX
Register Virtual Device and analyze the device data
PPTX
Analytics and etl based bi solutions
PPTX
Advanced risk management &amp; mitigation system
PPTX
Server driven user interface (sdui) – framework for i os applications!
PPTX
How to integrate portlet as widget in liferay to any website application
PPTX
A walkthrough of recently held wwdc17
PPTX
How wearable devices are changing our lives
PPTX
iPad Application as Return Process Automation Solution for eCommerce Store
PPTX
[Part 3] automation of home appliances using raspberry pi – all set to automa...
PPTX
Rfid systems for asset management — the young technology on its winning path
PPTX
[Part 2] automation of home appliances using raspberry pi – implementation of...
PPTX
[Part 1] automation of home appliances using raspberry pi – software installa...
Software Product Development for Startups.pdf
How Chatbots Empower Healthcare Ecosystem?
[Step by-step guide] configure document generation functionality in ms dynami...
How to overcome operational challenges in getting consistent beacon behavior
Liferay dxp – the good, the bad and the ugly
Realm mobile platform – explore real time data synchronization capabilities
A step by step guide to develop temperature sensor io t application using ibm...
How to create an angular 2.0 application in liferay dxp to fetch the ootb adv...
Register Virtual Device and analyze the device data
Analytics and etl based bi solutions
Advanced risk management &amp; mitigation system
Server driven user interface (sdui) – framework for i os applications!
How to integrate portlet as widget in liferay to any website application
A walkthrough of recently held wwdc17
How wearable devices are changing our lives
iPad Application as Return Process Automation Solution for eCommerce Store
[Part 3] automation of home appliances using raspberry pi – all set to automa...
Rfid systems for asset management — the young technology on its winning path
[Part 2] automation of home appliances using raspberry pi – implementation of...
[Part 1] automation of home appliances using raspberry pi – software installa...

Recently uploaded (20)

PDF
Encapsulation theory and applications.pdf
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Approach and Philosophy of On baking technology
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
Modernizing your data center with Dell and AMD
PPTX
Big Data Technologies - Introduction.pptx
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
Encapsulation theory and applications.pdf
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Diabetes mellitus diagnosis method based random forest with bat algorithm
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Unlocking AI with Model Context Protocol (MCP)
20250228 LYD VKU AI Blended-Learning.pptx
Approach and Philosophy of On baking technology
Reach Out and Touch Someone: Haptics and Empathic Computing
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Empathic Computing: Creating Shared Understanding
Modernizing your data center with Dell and AMD
Big Data Technologies - Introduction.pptx
Network Security Unit 5.pdf for BCA BBA.
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
MYSQL Presentation for SQL database connectivity
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Encapsulation_ Review paper, used for researhc scholars
The Rise and Fall of 3GPP – Time for a Sabbatical?

Liferay (DXP) 7 Tech Meetup for Developers

  • 2. OSGi Overview Portlets as Modules Services as Modules Extending Liferay DXP
  • 5. Benefits of OSGi • Reduced complexity • Reuse • Easy deployment • Dyanmic updates
  • 7. What is OSGi OSGi (Open Service Gateway Initiative) is a Java framework for developing and deploying modular software programs and libraries. Each bundle is a tightly coupled, dynamically loadable collection of classes, jars, and configuration files that explicitly declare their external dependencies (if any).
  • 9. Application / Bundles Operating System Hardware JVM Modules Life cycle Service Registry Services Security How OSGi Works
  • 10. How OSGi Works • Bundle • Bundle fragments • Bundle context
  • 11. Sample Config. of bundle Manifest-Version: 1.0 Bundle-Name: SimpleTestBundle Bundle-Activator: SimpleTestActivator Bundle-SymbolicName: SimpleTestBundle Bundle-Version: 1.0.0 Import-Package: org.azilen.framework; version=”1.3.1”
  • 12. How OSGi Works • Bundles - static entities • Services - dynamics in OSGi – Can appear, disappear at runtime according to a condition • Service – Object, registered by a bundle • BundleContext.registerService(iface, implementation, properties);
  • 14. • Blade – JAVA Package manager – jpm install -f https://releases.liferay.com/tools/blade- cli/latest/blade.jar • Liferay workspace with Blade – blade init [WORKSPACE_NAME] OSGi in Liferay
  • 15. OSGi Overview Portlets as Modules Services as Modules Extending Liferay DXP
  • 17. Modules as Portlets MVC Portlet Customize Portlet Configuration Portlet Provider Template
  • 18. MVC Portlet • Create portlet structure using blade – blade create -t mvc-portlet -p com.azilen.app.mvcportlet -c SampleMvcPortlet sample-mvc-portlet- project
  • 19. MVC Portlet MVC Action Command @Component( immediate = true, property = { "javax.portlet.name=com_azilen_liferay_portlet_SampleMVCPortlet", "mvc.command.name=actionCommand1", "mvc.command.name=actionCommand2" }, service = MVCActionCommand.class ) public class DemoMVCActionCommand extends BaseMVCActionCommand { @Override protected void doProcessAction(ActionRequest req, ActionResponse res) throws Exception { } }
  • 20. MVC Portlet @Component( immediate = true, property = { "javax.portlet.name=com_azilen_liferay_portlet_SampleMVCPortlet", "mvc.command.name=renderCommand1", "mvc.command.name=renderCommand2" }, service = MVCRenderCommand.class ) public class DemoRenderCommand implements MVCRenderCommand { @Override public String render(RenderRequest req, RenderResponse res) throws PortletException { } } MVC Render Command
  • 21. MVC Portlet MVC Resource Command @Component( immediate = true, property = { "javax.portlet.name=com_azilen_liferay_portlet_SampleMVCPortlet", "mvc.command.name=ajax1", }, service = MVCResourceCommand.class ) public class DemoMVCResourceCommand extends BaseMVCResourceCommand { @Override protected void doServeResource(ResourceRequest res, ResourceResponse res) throws Exception { } }
  • 22. Customize Portlet Configuration Create an interface to represent your config. @Meta.OCD(id = "com.azilen.liferay.config.ChartConfig") public interface ChartConfig { public static final String FIELD_CHART_TITLE = "chartTitle"; @Meta.AD(required = false) public String getChartTitle(); }
  • 23. Customize Portlet Configuration Implement your configuration action class and add a reference to your configuration @Component( configurationPid = "com.azilen.liferay.config.ChartConfig", configurationPolicy = ConfigurationPolicy.OPTIONAL, immediate = true, property = { "javax.portlet.name=com_azilen_liferay_portlet_DemoConfigurationScreen Portlet" }, service = ConfigurationAction.class ) public class ChartConfigAction extends DefaultConfigurationAction { }
  • 24. Customize Portlet Configuration • Implement the user interface for configuring your application • -metatype: * in project bnd.bnd file – generate an XML configuration file
  • 25. Portlet Provider Template • Provide mechanism to customize existing entity behavior. – Portlet should be added in hidden category. • Create a Java class – Extend BasePortletProvider class – Implement the appropriate portlet provider interface – e.g. AddPortletProvider,ViewPortletProvider, BrowsePortletProvider.
  • 26. Portlet Provider Template • Naming conventions – Make sure that class name has suffix PortletProvider • To override the default portlet with a custom portlet – Assign your portlet a higher service ranking. – Add in @Component declaration • property= {"service.ranking:Integer=Integer.MAX _VALUE"}
  • 27. Portlet Provider Template Specify the methods you’d like to implement @Component( property = { "mod- el.class.name=com.liferay.document.library.kernel.model.DLF ileEntry", "service.ranking:Integer=" + Integer.MAX_VALUE }, service = AddPortletProvider.class ) public class ProviderTemplateAddPortletProvider extends BasePortletProvider implements AddPortletProvider { }
  • 28. OSGi Overview Portlets as Modules Services as Modules Extending Liferay DXP
  • 30. Using Service Builder Creating Service Wrappers OSGi Services
  • 31. Using Service Builder • To create service builder modules : – blade create -t service-builder [-p packageName] projectName e.g. blade create -t service-builder -p com.azilen.service.book book – Above command will create two modules : book-api and book-service. • To run service builder: – blade gw buildService
  • 33. • Things Unchanged: – service.xml – Custom SQL – Dynamic Query – Finder methods – Model Hints – Adding new methods into EntityServiceImpl, EntityLocalServiceImpl, EntityImpl
  • 34. Using Service Builder • Using service objects in portlet – @Reference – OSGi Injection public class BookPortlet extends MVCPortlet { private BookLocalService bookLocalService; @Reference public void setBookLocalService(BookLocalService bookLocalService) { this.bookLocalService = bookLocalService; } … }
  • 35. Creating Service Wrappers • Override Liferay’s OOTB services • Service wrapper hooks in LR 6.2. • To create service wrapper module : – blade create -t service-wrapper [-p packageName] [-c className] [-s serviceWrapperToExtend] projectName – e.g. blade create -t service-wrapper -p com.azilen.serviceoverride -c CustomUserLocalService -s com.liferay.portal.kernel.service.UserLocalServ iceWrapper service-override
  • 36. Creating Service Wrappers @Component( immediate = true, property = { }, service = ServiceWrapper.class ) public class CustomUserLocalService extends UserLocalServiceWrapper { private static final Log _log = LogFactoryUtil.getLog(CustomUserLocalService.class); public CustomUserLocalService() { super(null); } }
  • 37. Creating Service Wrappers • Override methods as required. @Override public int authenticateByEmailAddress(long companyId, String emailAddress, String password, Map<String, String[]> headerMap, Map<String, String[]> parameterMap, Map<String, Object> resultsMap) throws PortalException { // Custom logic _log.info("Custom Implementation of authenticateByEmailAddress()"); // Calling Liferay's default implementation of service return super.authenticateByEmailAddress(companyId, emailAddress, password, headerMap, parameterMap, resultsMap); }
  • 38. OSGi services • OSGi Services can be registered with Activator public class CalcServiceActivator implements BundleActivator { private ServiceRegistration<CalcService> reg; @Override public void start(BundleContext bundleContext) throws Exception { reg = bundleContext.registerService(CalcService.class, new CalcServiceImpl(), null); } @Override public void stop(BundleContext bundleContext) throws Exception { reg.unregister(); } }
  • 39. OSGi services • Injecting OSGi Services in portlets • Null check before using service object public class CalcPortlet extends MVCPortlet { private CalcService _calcService; @Reference public void setCalcService(CalcService calcService) { this._calcService = calcService; } … }
  • 40. OSGi Overview Portlets as Modules Services as Modules Extending Liferay DXP
  • 42. Fragments • Extension of host module • Uses same classloader as host module • Extending out of box modules based on requirements • Earlier versions used Hook plugins • Create a Liferay fragment – blade create -t fragment [-h hostBundleName] [-H hostBundleVersion] projectName
  • 43. Customize Existing JSP Override Language properties Add Servlet Filter Add Custom event
  • 44. Customize Existing JSP • Override Liferay Login module – blade create -t fragment -h com.liferay.login.web -H 1.0.7 login- fragment-module • Find host module symbolic name and version – Connect to gogo shell using • telnet localhost 11311 – 219 ACTIVE com.liferay.login.web_1.0.7
  • 45. Customizing existing JSP • copy jsp from Liferay- src/modules/apps/foundation/login/login- web/src/main/resources/META- INF/resources/login.jsp and paste it in login-fragment- src/main/resources/META-INF/resources/.
  • 46. Override Language Properties • Want to change Login portlet authentication failed message – authentication-failed key • blade create -t mvc-portlet -p com.azilen.fragment.language -c CustomLanguageComponent language- fragment-module
  • 47. Override Language Properties @Component( property = { "language.id=en_US" }, service = ResourceBundle.class ) public class CustomLanguageComponent extends ResourceBundle { ResourceBundle bundle = ResourceBundle.getBundle("content.Language", UTF8Control.INSTANCE); @Override protected Object handleGetObject(String key) { return bundle.getObject(key); } @Override public Enumeration<String> getKeys() { return bundle.getKeys(); } }
  • 48. Override Language Properties • Create Language_en.properties under /language-fragment- module/src/main/resources/content • Add authentication-failed language key with custom message. – authentication-failed=Authentication failed. Make sure you entered correct username and password.
  • 49. Add Servlet Filter • Used for intercepting http request • Extend BaseFilter class • e.g. Intercept every request and print log
  • 50. Add Servlet Filter @Component( immediate = true, property = { "dispatcher=REQUEST", "dispatcher=FORWARD", "servlet-context-name=", "servlet-filter-name=Custom Filter", "url-pattern=/*" }, service = Filter.class ) public class CustomFilter extends BaseFilter { private static final Log _log = LogFactoryUtil.getLog(CustomFilter.class); @Override protected void processFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws Exception { _log.info("Intercepted request : " + request); filterChain.doFilter(request, response); } }
  • 51. Add Custom Event • com.liferay.portal.kernel.events.Lif ecycleAction is one of the extension points that can be leveraged by service template • Create a new module using “service” template – e.g., blade create –t service –p com.azilen.training.lifecycle.loginpost action –c CustomLoginPostAction –s com.liferay.portal.kernel.events.Lifecy cleAction login-post-action
  • 52. Add Custom Event@Component( property = { "key=login.events.post" }, service = LifecycleAction.class ) public class CustomLoginPostAction implements LifecycleAction { private static final Log _log = LogFactoryUtil.getLog(CustomLoginPostAction.class); @Override public void processLifecycleEvent(LifecycleEvent lifecycleEvent) throws ActionException { HttpServletRequest request = lifecycleEvent.getRequest(); User user = null; try { user = PortalUtil.getUser(request); } catch (PortalException e) { _log.error(e); } … } }
  • 53. Add Custom Event • Apart from this lifecycle event, there are many other such portal lifecycle events supported like: login.events.post, logout.events.post, logout.events.pre, global.shutdown.events, global.startup.events, application.shutdown.events, application.startup.events
  • 54. OSGi Overview Portlets as Modules Services as Modules Extending Liferay DXP

Editor's Notes

  • #4: Why - Benefits of OSGi What - What is OSGi How - Architecture of OSGi
  • #36: Similar concept as Service wrapper hook in LR 6.2 Used to override Liferay’s OOTB remote and local services.
  • #56: Add Summary