Leveraging OSGi to Create Extensible Plugins for Liferay 6.2

Post on 07-Aug-2015

130 views 1 download

Tags:

transcript

Leveraging OSGi to Create

Extensible Plugins for Liferay 6.2

Eduardo García edupgv@Julio Camarero juliocamarero@Core Engineers at Liferay, Inc

Milen Dyankov milendyankov@Senior Consultant at Liferay, Inc

OSGi is about

modularity

... and Liferay already

allowed for

modularity ...

PortletsPortlets

HooksHooks

ThemesThemes

LayoutsLayouts

......

... but modules are

not modular !!!

OSGi brings into

Liferay

modularity of

modules !!!

...

Microservices

Supported in

Liferay marketplace

Let’s see an example…

A Shipping Cost Calculator

https://github.com/epgarcia/liferay-plugins/commits/LRNAS2014.OSGI

final price

common features for all countries

specific features for each country

we could…

Develop a very complex and laborious application that covers all possible cases

Release a new version every time any shipping cost

algorithm changes or we add new countries

Develop a simple core application that covers only the common features

Make the application extensible with country modules“ ”

If a shipping algorithm changes, our core application remains the same and only that specific

extension must be changed

will be the future of all

Liferay 7 applications ...

... because it’s all advantages!

improves

maintainability

maximizes

reusability

simplification of

releases(independent)

new market

opportunities(extensions)

App

ver. 1

App

ver. 2

App

ver. 3

time

size

...

App

ver. 1

App

ver. 2

time

size

...

ext 1

ver. 1

ext 1

ver. 2

ext 1

ver. 3

ext 2

ver. 3

ext 2

ver. 1

ext 2

ver. 2

ext 3

ver. 1

ext 1

ver. 4

ext 3

ver. 2

But OSGi makes this

possible already in

Liferay 6.2 !

In fact, Audience Targeting,

the first Liferay 6.2 application

following this approach, is already

available on Marketplace!

Sounds great,

but I have no idea

about OSGi…

OSGi basic concepts

in 3 minutes!

(or what you need to understand

before we continue)

OSGi bundles (this is what our plug-ins are)

manifestmanifestmanifestmanifest manifest

Manifest-Version: 1.0Bundle-ManifestVersion: 2Bundle-Name: Shipping ImplBundle-SymbolicName: com.liferay.shipping.implBundle-Vendor: Liferay, Inc.Bundle-Version: 1.0.0Private-Package: com.liferay.shipping.impl.model,com.liferay.shipping.impl.utilRequire-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.6))". . .

#1

#1 OSGi bundles (this is what our plug-ins are)

manifestmanifestmanifestmanifest manifest

Manifest-Version: 1.0Bundle-ManifestVersion: 2Bundle-Name: Shipping ImplBundle-SymbolicName: com.liferay.shipping.implBundle-Vendor: Liferay, Inc.Bundle-Version: 1.0.0Private-Package: com.liferay.shipping.impl.model,com.liferay.shipping.impl.utilRequire-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.6))". . .

All modern build tools (Ant, Maven, Gradle, ...)

can build OSGi bundles!

So can Liferay SDK !

Package dependencies (this is how we describe what we provide and expect)

Import-Package: com.liferay.shipping.api.model,com.liferay.shipping.api.util,com.liferay.portal.kernel.io.unsync;resolution:=optional,com.liferay.portal.kernel.util;resolution:=optional,freemarker.cache;resolution:=optional,freemarker.template;resolution:=optional

Export-Package: com.liferay.shipping.api.model;version="1.0.0",com.liferay.shipping.api.util;version="1.0.0"

manifestmanifestmanifestmanifest manifestEXPORT EXPORT

#2

manifestmanifestmanifestmanifest manifestEXPORT EXPORT

Package dependencies (this is how we describe what we provide and expect)

Import-Package: com.liferay.shipping.api.model,com.liferay.shipping.api.util,com.liferay.portal.kernel.io.unsync;resolution:=optional,com.liferay.portal.kernel.util;resolution:=optional,freemarker.cache;resolution:=optional,freemarker.template;resolution:=optional

Export-Package: com.liferay.shipping.api.model;version="1.0.0",com.liferay.shipping.api.util;version="1.0.0"

#2

#2

manifestmanifestmanifestmanifest manifestEXPORT EXPORT

Package dependencies (this is how we describe what we provide and expect)

Import-Package: com.liferay.shipping.api.model,com.liferay.shipping.api.util,com.liferay.portal.kernel.io.unsync;resolution:=optional,com.liferay.portal.kernel.util;resolution:=optional,freemarker.cache;resolution:=optional,freemarker.template;resolution:=optional

Export-Package: com.liferay.shipping.api.model;version="1.0.0",com.liferay.shipping.api.util;version="1.0.0"

The BND tool (bnd.bndtools.org) can discover dependencies

and automatically generate export/import manifest headers!

Liferay SDK also allows you to use BND tool!

OSGi services (this is how we provide and consume functionality)

manifestmanifestmanifest manifest

OSGi service registry

Interface

Service 1

...

Service N

#3

OSGi services (this is how we provide and consume functionality)

manifestmanifestmanifest

OSGi service registry

Interface

Service 1

...

Service N

REGISTER

REGISTER

USE

manifest

#3

#3 OSGi services (this is how we provide and consume functionality)

manifestmanifestmanifest

OSGi service registry

Interface

Service 1

...

Service N

REGISTER

REGISTER

USE

manifest

There are number of component frameworks on top of OSGi

(Declarative Services and Blueprint being part of the specs)

which greatly simplify the usage of services!

Sounds great,

but how OSGi fits

into Liferay ?

Application server / Servlet container

Liferay 6.2

Liferay CORE

Portlet Portlet...

Application server / Servlet container

Liferay 6.2

Portlet application

Portlet application

Portlet application

Portlet application

Liferay CORE

Portlet Portlet...

Application server / Servlet container

Liferay 6.2

Portlet application

Portlet application

Portlet application

Portlet application

Liferay CORE

Portlet Portlet

OSGi container

...

Application server / Servlet container

Liferay 6.2

Portlet application

Portlet application

Portlet application

Portlet application

Liferay CORE

Portlet Portlet

OSGi container

OSGi core services

HTTP Service Configuration Admin Service

...

...Liferay core OSGi services

Application server / Servlet container

Liferay 6.2

Portlet application

Portlet application

Portlet application

Portlet application

Liferay CORE

Portlet Portlet

OSGi container

API Bundle

API Bundle

Service Bundle

Extension bundle

Service Bundle

Portlet Bundle

Extension Bundle

Portlet Bundle

OSGi core services

HTTP Service Configuration Admin Service

...

...Liferay core OSGi services

Application server / Servlet container

Liferay 6.2

Portlet application

Portlet application

Portlet application

Portlet application

Liferay CORE

Portlet Portlet

OSGi container

API Bundle

API Bundle

Service Bundle

Extension bundle

Service Bundle

Portlet Bundle

Extension Bundle

Portlet Bundle

OSGi core services

HTTP Service Configuration Admin Service

...

...Liferay core OSGi services

In Liferay 6.2 portlets inside OSGi

container have certain limitations!

shipping-api

shipping-impl

shipping-web

Shipping application

shipping-extension-europe

shipping-extension-usa

Shipping applicationextensions

Shipping application modules (bundles)

There is an extra step in Liferay 6.2

as not all dependencies are

provided!

You will NOT need to do this in

Liferay 7!

#0 Shipping application modules (bundles)

#1 Shipping application modules (bundles)

#1 Shipping application modules (bundles)

#1 Shipping application modules (bundles)

#2 Shipping application modules (bundles)

#2 Shipping application modules (bundles)

#2 Shipping application modules (bundles)

#2 Shipping application modules (bundles)

#2 Shipping application modules (bundles)

#3 Shipping application modules (bundles)

This approach is for Liferay 6.2 only !

It will change in Liferay 7 !

This approach is for Liferay 6.2 only !

It will change in Liferay 7 !

#3 Shipping application modules (bundles)

Our main application

is ready!

Let's try it !

#4 Shipping application modules (bundles)

#4 Shipping application modules (bundles)

Let's try it !

#5 Shipping application modules (bundles)

#5 Shipping application modules (bundles)

Let's try it !

Where you go from

here?

Send feedback!

Build your own OSGi modules

Learn more about OSGi

Try the samples yourselfhttps://github.com/epgarcia/liferay-plugins/commits/LRNAS2014.OSGI

Thank you!

milen.dyankov@liferay.com

http://www.liferay.com/web/milen.dyankov/

@milendyankov@LiferayPL

http://www.liferay.com

@Liferay

http://www.facebook.com/Liferay