148
OSGi in Action Karl Pauls [email protected] Clement Escoffier [email protected] COMASIC. Ada Diaconescu – ada.diaconescu_at_telecom-paristech.fr

OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi in Action

Karl Pauls [email protected]

Clement Escoffier [email protected]

COMASIC. Ada Diaconescu – ada.diaconescu_at_telecom-paristech.fr

Page 2: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi in Action - Clement Escoffier ([email protected])2

Page 3: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Limits of Object-Oriented Programming (OOP)

� Coupling severely limits reusability� Using a generic object, can drag in a large number of other objects

� Creates overly large systems after a certain complexity is reached

OSGi in Action - Clement Escoffier

([email protected])3

a certain complexity is reached

� Flexibility must be built in by the programmer� Plug-in architectures

� Factories, Dependency Injection

Page 4: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Modularize !

OSGi in Action - Clement Escoffier

([email protected])4

Monolithic

Application

Modular

Application

Modular and Dynamic

Application

Modular and Dynamic

Killer Application

Page 5: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Why OSGi ?

� Need simpler ways to construct software systems

� OSGi is about:

� Software construction: building systems

OSGi in Action - Clement Escoffier

([email protected])5

� Software construction: building systems out of smaller components …

� Components that work together …

� Managing components …

� “Universal Middleware”

Page 6: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi in Action - Clement Escoffier ([email protected])6

Page 7: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi Technology / Service Platform

� The dynamic module system for Java TM

� Provides :

� Standardized primitives that allow applications to be

constructed from small, reusable and collaborative components

7

constructed from small, reusable and collaborative components

� Functions to dynamically change the composition, without

requiring restarts

� A service-oriented architecture that enables components to

dynamically discover each other for collaboration => minimize

coupling and render it manageable

OSGi in Action - Clement Escoffier - [email protected]

Ada Diaconescu – [email protected]

Page 8: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi Alliance

� Industry consortium

� OSGi Service Platform specification� Framework specification for hosting dynamically downloadable services

� Standard service specifications� Standard service specifications

� Several expert groups define the specifications� Core Platform Expert Group (CPEG)

� Mobile Expert Group (MEG)

� Vehicle Expert Group (VEG)

� Enterprise Expert Group (EEG)

8 OSGi in Action - Clement Escoffier

([email protected])

Page 9: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi Architectural Overview

9 OSGi in Action - Clement Escoffier

([email protected])

Page 10: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi Framework Layering

LIFECYCLE

SERVICE

L2 - Manages the lifecycle of bundles in a bundle repository without requiring the

L3 – Provides a publish/find/bind service model to decouple bundles

OSGi in Action - Clement Escoffier

([email protected])10

MODULE

LIFECYCLE

L1 - Creates the concept of bundles that use classes from each other in a controlled way according to constraints

a bundle repository without requiring the Virtual Machine (VM) to be restarted

Page 11: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi Framework (1/2)

� Component-oriented framework

� Bundles - i.e., modules/components

� Package sharing and version management

� Life-cycle management and notification

� Service-oriented architecture

� Publish/find/bind intra-VM service model

� Open remote management architecture

� No prescribed policy or protocol

11 OSGi in Action - Clement Escoffier

([email protected])

Page 12: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi Framework (2/2)

� Runs multiple applications and services

� Single Virtual Machine (VM) instance

� Separate Class-Loader per Bundle

� Class-Loader graph

� Independent namespaces� Independent namespaces

� Class sharing at the Java package level

� Java Permissions to secure framework

� Explicitly considers dynamic scenarios

� Run-time install, update and uninstall of Bundles

12 OSGi in Action - Clement Escoffier

([email protected])

Page 13: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi in Action - Clement Escoffier ([email protected])13

Page 14: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Modularity

� What?

14 OSGi in Action - Clement Escoffier

([email protected])

Page 15: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Modularity

� What?

� Separation of concerns

� Structure

� Encapsulation

� Focuses on

Cohesion (low is bad, high is good)� Cohesion (low is bad, high is good)

� Coupling (low is good, high is bad)

� Why?

15 OSGi in Action - Clement Escoffier

([email protected])

Page 16: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Modularity

� What?

� Separation of concerns

� Structure

� Encapsulation

� Focuses on

Cohesion (low is bad, high is good)� Cohesion (low is bad, high is good)

� Coupling (low is good, high is bad)

� Why?

� Independent development

� Independent maintenance and evolution

� Improve reusability

16 OSGi in Action - Clement Escoffier

([email protected])

Page 17: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi Bundle

� A bundle is a module in OSGi terminology

� A bundle is a JAR file containing

� Code

� Resources

� Metadata

Module

class files

resource filesMANI

FEST

.MF

metadata

17 OSGi in Action - Clement Escoffier

([email protected])

Page 18: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Code Visibility Metadata

� A bundle is a JAR file containing code

� What code in the JAR file is visible to other code in the JAR file?

� What code in the JAR file is visible to code outside the JAR file?

� What code outside the JAR file is visible to code inside the JAR

file?file?

� Unlike standard JAR files, OSGi metadata explicitly answers

all of these questions

18 OSGi in Action - Clement Escoffier

([email protected])

Page 19: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Internal Code Visibility

� Internal code in standard JARs can see all root-relative

packages

� Not the case with bundles

19 OSGi in Action - Clement Escoffier

([email protected])

Page 20: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Internal Code Visibility

� Internal code in standard JARs can see all root-relative

packages

� Not the case with bundles

� Bundles must specify Bundle-ClassPath

� Comma-delimited list indicating where to search in the JAR file

when looking for classeswhen looking for classes

20 OSGi in Action - Clement Escoffier

([email protected])

Page 21: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Internal Code Visibility

� Internal code in standard JARs can see all root-relative

packages

� Not the case with bundles

� Bundles must specify Bundle-ClassPath

� Comma-delimited list indicating where to search in the JAR file � Comma-delimited list indicating where to search in the JAR file

when looking for classes

� To get standard JAR behavior

� Bundle-ClassPath: .

21 OSGi in Action - Clement Escoffier

([email protected])

Page 22: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Internal Code Visibility

� Internal code in standard JARs can see all root-relative packages� Not the case with bundles

� Bundles must specify Bundle-ClassPath� Comma-delimited list indicating where to search in the JAR file when looking for classeswhen looking for classes

� To get standard JAR behavior� Bundle-ClassPath: .

� May also include embedded JARs and directories

� Examples� Bundle-ClassPath: lib/foo.jar,classes/� Bundle-ClassPath: lib/foo.jar,.

22 OSGi in Action - Clement Escoffier

([email protected])

Page 23: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Exposing Internal Code (1/2)

� Standard JAR files expose all internal root-relative

packages

� Not the case with bundles

23 OSGi in Action - Clement Escoffier

([email protected])

Page 24: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Exposing Internal Code (1/2)

� Standard JAR files expose all internal root-relative

packages

� Not the case with bundles

� Bundles must specify Export-Package

� List of packages from the bundle class path to expose

Uses common OSGi syntax mentioned earlier� Uses common OSGi syntax mentioned earlier

� Why do this?

24 OSGi in Action - Clement Escoffier

([email protected])

Page 25: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Exposing Internal Code (1/2)

� Standard JAR files expose all internal root-relative

packages

� Not the case with bundles

� Bundles must specify Export-Package

� List of packages from the bundle class path to expose

Uses common OSGi syntax mentioned earlier� Uses common OSGi syntax mentioned earlier

� Why do this?

� It separates internal visibility from external visibility

� In other words, it allows bundles to have private content

25 OSGi in Action - Clement Escoffier

([email protected])

Page 26: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Accessing External Code (1/2)

� Standard JARs implicitly see everything in the class path

� Not the case with bundles

26 OSGi in Action - Clement Escoffier

([email protected])

Page 27: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Accessing External Code (1/2)

� Standard JARs implicitly see everything in the class path

� Not the case with bundles

� Bundles must specify Import-Package

� List of packages needed from other bundles

� Uses common OSGi syntax mentioned earlier

27 OSGi in Action - Clement Escoffier

([email protected])

Page 28: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Accessing External Code (1/2)

� Standard JARs implicitly see everything other class on the

class path

� Not the case with bundles

� Bundles must specify Import-Package

� List of packages needed from other bundles

Uses common OSGi syntax mentioned earlier� Uses common OSGi syntax mentioned earlier

� Bundles must import every needed package not

contained in the bundle itself, except java.*

� Why do this?

28 OSGi in Action - Clement Escoffier

([email protected])

Page 29: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Accessing External Code (1/2)

� Standard JARs implicitly see everything other class on the

class path

� Not the case with bundles

� Bundles must specify Import-Package

� List of packages needed from other bundles

Uses common OSGi syntax mentioned earlier� Uses common OSGi syntax mentioned earlier

� Bundles must import every needed package not

contained in the bundle itself, except java.*

� Why do this?

� Make dependencies explicit

� Make dependencies manageable

29 OSGi in Action - Clement Escoffier

([email protected])

Page 30: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Manifest Example

Bundle-ManifestVersion: 2Bundle-SymbolicName: org.foo.simplebundleBundle-Version: 1.0.0Bundle-ClassPath: .,org/foo/embedded.jarImport-Package:

osgi.service.log; version="[1.0.0,1.1.0)",org.foo.service ; version= "1.1"org.foo.service ; version= "1.1"

Export-Package:org.foo.service; version="1.1";

vendor="org.foo",org.foo.service.bar; version="1.1";

uses:="org.foo.service"

30 OSGi in Action - Clement Escoffier

([email protected])

Page 31: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Manifest Example

Bundle-ManifestVersion: 2Bundle-SymbolicName: org.foo.simplebundleBundle-Version: 1.0.0Bundle-ClassPath: .,org/foo/embedded.jarImport-Package:

osgi.service.log; version="[1.0.0,1.1.0)",org.foo.service ; version= "1.1"

Indicates R4

semantics and syntax

org.foo.service ; version= "1.1"Export-Package:

org.foo.service; version="1.1";vendor="org.foo",

org.foo.service.bar; version="1.1";uses:="org.foo.service"

31 OSGi in Action - Clement Escoffier

([email protected])

Page 32: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Manifest Example

Bundle-ManifestVersion: 2Bundle-SymbolicName: org.foo.simplebundleBundle-Version: 1.0.0Bundle-ClassPath: .,org/foo/embedded.jarImport-Package:

osgi.service.log; version="[1.0.0,1.1.0)",org.foo.service ; version= "1.1"Indicates R4

semantics and syntaxGlobally unique IDorg.foo.service ; version= "1.1"

Export-Package:org.foo.service; version="1.1";

vendor="org.foo",org.foo.service.bar; version="1.1";

uses:="org.foo.service"

semantics and syntaxGlobally unique ID

32 OSGi in Action - Clement Escoffier

([email protected])

Page 33: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Manifest Example

Bundle-ManifestVersion: 2Bundle-SymbolicName: org.foo.simplebundleBundle-Version: 1.0.0Bundle-ClassPath: .,org/foo/embedded.jarImport-Package:

osgi.service.log; version="[1.0.0,1.1.0)",org.foo.service ; version= "1.1"

Internal bundle class pathorg.foo.service ; version= "1.1"

Export-Package:org.foo.service; version="1.1";

vendor="org.foo",org.foo.service.bar; version="1.1";

uses:="org.foo.service"

Internal bundle class path

33 OSGi in Action - Clement Escoffier

([email protected])

Page 34: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Manifest Example

Bundle-ManifestVersion: 2Bundle-SymbolicName: org.foo.simplebundleBundle-Version: 1.0.0Bundle-ClassPath: .,org/foo/embedded.jarImport-Package:osgi.service.log; version="[1.0.0,1.1.0)",org.foo.service ; version= "1.1"

Import of a

package version range

org.foo.service ; version= "1.1"Export-Package:

org.foo.service; version="1.1";vendor="org.foo",

org.foo.service.bar; version="1.1";uses:="org.foo.service"

34 OSGi in Action - Clement Escoffier

([email protected])

Page 35: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Manifest Example

Bundle-ManifestVersion: 2Bundle-SymbolicName: org.foo.simplebundleBundle-Version: 1.0.0Bundle-ClassPath: .,org/foo/embedded.jarImport-Package:

osgi.service.log; version="[1.0.0,1.1.0)",org.foo.service; version="1.1"

Importing an exported

package

org.foo.service; version="1.1"Export-Package:

org.foo.service; version="1.1";vendor="org.foo",

org.foo.service.bar; version="1.1";uses:="org.foo.service"

35 OSGi in Action - Clement Escoffier

([email protected])

Page 36: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Manifest Example

Bundle-ManifestVersion: 2Bundle-SymbolicName: org.foo.simplebundleBundle-Version: 1.0.0Bundle-ClassPath: .,org/foo/embedded.jarImport-Package:

osgi.service.log; version="[1.0.0,1.1.0)",org.foo.service ; version= "1.1"

Exported package with

version and arbitrary

attributeorg.foo.service ; version= "1.1"

Export-Package:org.foo.service; version="1.1";

vendor="org.foo",org.foo.service.bar; version="1.1";

uses:="org.foo.service"

36 OSGi in Action - Clement Escoffier

([email protected])

Page 37: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Manifest Example

Bundle-ManifestVersion: 2Bundle-SymbolicName: org.foo.simplebundleBundle-Version: 1.0.0Bundle-ClassPath: .,org/foo/embedded.jarImport-Package:

osgi.service.log; version="[1.0.0,1.1.0)",org.foo.service ; version= "1.1"

Provided package withProvided package with

dependency on exportedorg.foo.service ; version= "1.1"

Export-Package:org.foo.service; version="1.1";

vendor="org.foo",org.foo.service.bar; version="1.1";

uses:="org.foo.service"

dependency on exported

package

37 OSGi in Action - Clement Escoffier

([email protected])

Page 38: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Dependency Resolution (1/2)

� Automatically managed by the OSGi framework

� Ensures a bundle's dependencies are satisfied before the

bundle can be used

38 OSGi in Action - Clement Escoffier

([email protected])

Page 39: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Dependency Resolution (1/2)

� Automatically managed by the OSGi framework

� Ensures a bundle's dependencies are satisfied before the

bundle can be used

� In simple terms, resolving a bundle matches its imported

packages to bundles providing themimport import

A B C

import

javax.servlet.http

export

javax.servlet.http

import

javax.servlet

export

javax.servlet

39 OSGi in Action - Clement Escoffier

([email protected])

Page 40: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Dependency Resolution (1/2)

� Automatically managed by the OSGi framework

� Ensures a bundle's dependencies are satisfied before the

bundle can be used

� In simple terms, resolving a bundle matches its imported

packages to bundles providing themimport import

� Typically, resolving a bundle will result in other bundles being

transitively resolved

A B C

import

javax.servlet.http

export

javax.servlet.http

import

javax.servlet

export

javax.servlet

40 OSGi in Action - Clement Escoffier

([email protected])

Page 41: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Dependency Resolution (1/2)

� Automatically managed by the OSGi framework

� Ensures a bundle's dependencies are satisfied before the bundle can be used

� In simple terms, resolving a bundle matches its imported packages to bundles providing them

A B C

import

javax.servlet.http

import

javax.servlet

� Typically, resolving a bundle will result in other bundles being transitively resolved

� If a version or arbitrary attributes are specified on imports, then exports must match

� Multiple attributes on an import are logically ANDed

A B Cjavax.servlet.http

export

javax.servlet.http

javax.servlet

export

javax.servlet

41 OSGi in Action - Clement Escoffier

([email protected])

Page 42: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Dependency Resolution (2/2)

� Multiple matching providers

import

javax.servlet;

version=”2.4.0”

export

javax.servlet;

version=”2.4.0”

? C

A

B

export

javax.servlet;

version=”2.5.0”

? C

A

42 OSGi in Action - Clement Escoffier

([email protected])

Page 43: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Dependency Resolution (2/2)� Multiple matching providers

C

A

import

javax.servlet;

version=”2.4.0”

B

export

javax.servlet;

version=”2.4.0”

?

� Resolution algorithm orders matching providers� Already resolved providers ordered by decreasing version

� Unresolved providers ordered by decreasing version

� If versions are equal, matching providers are ordered based on installation order

C

A

export

javax.servlet;

version=”2.5.0”

?

43 OSGi in Action - Clement Escoffier

([email protected])

Page 44: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Non-Modular Paint Program (1/3)

� We have a simple paint program

44 OSGi in Action - Clement Escoffier

([email protected])

Page 45: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Non-Modular Paint Program (2/3)

� It is packaged as a single JAR file with the following

contents:META-INF/META-INF/MANIFEST.MForg/org/foo/org/foo/paint/org/foo/paint/PaintFrame$1$1.classorg/foo/paint/PaintFrame$1.classorg/foo/paint/PaintFrame$1.classorg/foo/paint/PaintFrame$ShapeActionListener.classorg/foo/paint/PaintFrame.classorg/foo/paint/SimpleShape.classorg/foo/paint/ShapeComponent.classorg/foo/shape/org/foo/shape/Circle.classorg/foo/shape/circle.pngorg/foo/shape/Square.classorg/foo/shape/square.pngorg/foo/shape/Triangle.classorg/foo/shape/triangle.png

45 OSGi in Action - Clement Escoffier

([email protected])

Page 46: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Non-Modular Paint Program (2/3)

� It is packaged as a single JAR file with the following

contents:META-INF/META-INF/MANIFEST.MForg/org/foo/org/foo/paint/org/foo/paint/PaintFrame$1$1.classorg/foo/paint/PaintFrame$1.class

Main implementation

package isorg.foo.paint

org/foo/paint/PaintFrame$1.classorg/foo/paint/PaintFrame$ShapeActionListener.classorg/foo/paint/PaintFrame.classorg/foo/paint/SimpleShape.classorg/foo/paint/ShapeComponent.classorg/foo/shape/org/foo/shape/Circle.classorg/foo/shape/circle.pngorg/foo/shape/Square.classorg/foo/shape/square.pngorg/foo/shape/Triangle.classorg/foo/shape/triangle.png

46 OSGi in Action - Clement Escoffier

([email protected])

Page 47: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Non-Modular Paint Program (2/3)

� It is packaged as a single JAR file with the following

contents:META-INF/META-INF/MANIFEST.MForg/org/foo/org/foo/paint/org/foo/paint/PaintFrame$1$1.classorg/foo/paint/PaintFrame$1.class

Static main method inPaintFrameorg/foo/paint/PaintFrame$1.class

org/foo/paint/PaintFrame$ShapeActionListener.classorg/foo/paint/PaintFrame.classorg/foo/paint/SimpleShape.classorg/foo/paint/ShapeComponent.classorg/foo/shape/org/foo/shape/Circle.classorg/foo/shape/circle.pngorg/foo/shape/Square.classorg/foo/shape/square.pngorg/foo/shape/Triangle.classorg/foo/shape/triangle.png

PaintFrame

47 OSGi in Action - Clement Escoffier

([email protected])

Page 48: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Non-Modular Paint Program (2/3)

� It is packaged as a single JAR file with the following

contents:META-INF/META-INF/MANIFEST.MForg/org/foo/org/foo/paint/org/foo/paint/PaintFrame$1$1.classorg/foo/paint/PaintFrame$1.class

Interface Interface SimpleShapesupports multiple shapeorg/foo/paint/PaintFrame$1.class

org/foo/paint/PaintFrame$ShapeActionListener.classorg/foo/paint/PaintFrame.classorg/foo/paint/SimpleShape.classorg/foo/paint/ShapeComponent.classorg/foo/shape/org/foo/shape/Circle.classorg/foo/shape/circle.pngorg/foo/shape/Square.classorg/foo/shape/square.pngorg/foo/shape/Triangle.classorg/foo/shape/triangle.png

supports multiple shape

implementations

48 OSGi in Action - Clement Escoffier

([email protected])

Page 49: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Non-Modular Paint Program (2/3)

� It is packaged as a single JAR file with the following

contents:META-INF/META-INF/MANIFEST.MForg/org/foo/org/foo/paint/org/foo/paint/PaintFrame$1$1.classorg/foo/paint/PaintFrame$1.classorg/foo/paint/PaintFrame$1.classorg/foo/paint/PaintFrame$ShapeActionListener.classorg/foo/paint/PaintFrame.classorg/foo/paint/SimpleShape.classorg/foo/paint/ShapeComponent.classorg/foo/shape/org/foo/shape/Circle.classorg/foo/shape/circle.pngorg/foo/shape/Square.classorg/foo/shape/square.pngorg/foo/shape/Triangle.classorg/foo/shape/triangle.png

Shape implementationsdefined in org.foo.shape

49 OSGi in Action - Clement Escoffier

([email protected])

Page 50: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Non-Modular Paint Program (3/3)

� Relationship among classes

PaintFrame

SimpleShape

1 *

1 1

ShapeComponent

1 *

Circle Square Triangle

50 OSGi in Action - Clement Escoffier

([email protected])

Page 51: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Non-Modular Paint Program (3/3)

� Relationship among classes

PaintFrame

SimpleShape

1 *

1

1 1

*

How to decompose

into bundles?

ShapeComponent

1 *

Circle Square Triangle

51 OSGi in Action - Clement Escoffier

([email protected])

Page 52: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Modular Paint Program Design

Shape

Paint

export

org.foo.shape

Circ

le

export

Square

export

org.foo.shape.square Tria

ngleexport

org.foo.shape.triangle

export

org.foo.shape.circle

52 OSGi in Action - Clement Escoffier

([email protected])

Page 53: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Benefits of Modularized Paint Program

� Enforced logical boundaries

� Automatic dependency resolution

� Ensures proper configuration

� Improves reusability of code

� Improves ability to create different configurations� Improves ability to create different configurations

53 OSGi in Action - Clement Escoffier

([email protected])

Page 54: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi in Action - Clement Escoffier ([email protected])54

Page 55: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

What & Why of Lifecycle Layer

� Once we have a bundle, what do we do with it?

� We need to somehow tell the OSGi framework about it

55 OSGi in Action - Clement Escoffier

([email protected])

Page 56: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

What & Why of Lifecycle Layer

� Once we have a bundle, what do we do with it?

� We need to somehow tell the OSGi framework about it

� What if our bundle needs to be initialized somehow?

� We need some sort of hook in the framework

56 OSGi in Action - Clement Escoffier

([email protected])

Page 57: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

What & Why of Lifecycle Layer

� Once we have a bundle, what do we do with it?

� We need to somehow tell the OSGi framework about it

� What if our bundle needs to be initialized somehow?

� We need some sort of hook in the framework

� What if we want to add and remove bundles at run time?What if we want to add and remove bundles at run time?

� We need someway to access the underlying framework

57 OSGi in Action - Clement Escoffier

([email protected])

Page 58: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

What & Why of Lifecycle Layer

� Once we have a bundle, what do we do with it?

� We need to somehow tell the OSGi framework about it

� What if our bundle needs to be initialized somehow?

� We need some sort of hook in the framework

� What if we want to add and remove bundles at run time?What if we want to add and remove bundles at run time?

� We need someway to access the underlying framework

� We can do all of these things with a well-defined lifecycle

for bundles

� A lifecycle defines the stages of a bundle's lifetime

� The framework associates a lifecycle state with each bundle

58 OSGi in Action - Clement Escoffier

([email protected])

Page 59: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Life Cycle

INSTALLEDINSTALLED

RESOLVEDUNINSTALLED

install

updateuninstall resolve

uninstallRESOLVEDRESOLVEDUNINSTALLEDUNINSTALLED

STARTINGSTARTING STOPPINGSTOPPING

ACTIVEACTIVE

explicit

automatic

uninstall

start

stop

59 OSGi in Action - Clement Escoffier

([email protected])

Page 60: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Life Cycle

UNINSTALLED

updateuninstall

uninstall

INSTALLEDINSTALLED

install

resolve

RESOLVEDUNINSTALLEDUNINSTALLED

STARTINGSTARTING STOPPINGSTOPPING

ACTIVEACTIVE

explicit

automatic

uninstall

start

stop

RESOLVEDRESOLVED

Resolving a bundle, resolves

its code dependencies

60 OSGi in Action - Clement Escoffier

([email protected])

Page 61: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Life Cycle

resolve

INSTALLED

install

updateuninstall

uninstall

Activating a bundle, provides

an opportunity to initialize

and access the framework

OSGi in Action - Clement Escoffier

([email protected])61

UNINSTALLED

explicit

automatic

uninstall

start

RESOLVED

STOPPINGSTARTING

stop

ACTIVE

Page 62: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Activator

� The bundle activator is a framework hook to allow

bundles to startup and shutdown

62 OSGi in Action - Clement Escoffier

([email protected])

Page 63: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Activator

� The bundle activator is a framework hook to allow

bundles to startup and shutdown

� The hook is invoked in the STARTING/STOPPING states

63 OSGi in Action - Clement Escoffier

([email protected])

Page 64: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Activator

� The bundle activator is a framework hook to allow

bundles to startup and shutdown

� The hook is invoked in the STARTING/STOPPING states

� An activator implements a simple interface and is included in

the bundle JAR file

public interface BundleActivator {public interface BundleActivator {void start(BundleContext context) throws Exception;void stop(BundleContext context) throws Exception;

}

64 OSGi in Action - Clement Escoffier

([email protected])

Page 65: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Activator

� The bundle activator is a framework hook to allow

bundles to startup and shutdown

� The hook is invoked in the STARTING/STOPPING states

� An activator implements a simple interface and is included in

the bundle JAR file

public interface BundleActivator {

� Additional manifest metadata is needed to declare the

activator

public interface BundleActivator {void start(BundleContext context) throws Exception;void stop(BundleContext context) throws Exception;

}

Bundle-Activator: <fully-qualified-class-name>e.g.:Bundle-Activator: org.foo.MyActivator

65 OSGi in Action - Clement Escoffier

([email protected])

Page 66: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Activator

� The bundle activator is a framework hook to allow

bundles to startup and shutdown

� The hook is invoked in the STARTING/STOPPING states

� An activator implements a simple interface and is included in

the bundle JAR file

public interface BundleActivator {

� Additional manifest metadata is needed to declare the

activator

public interface BundleActivator {void start( BundleContext context) throws Exception;void stop( BundleContext context) throws Exception;

}

Bundle-Activator: <fully-qualified-class-name>e.g.:Bundle-Activator: org.foo.MyActivator

What are these?

66 OSGi in Action - Clement Escoffier

([email protected])

Page 67: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Context

� Represents the bundle's execution context

public interface BundleContext {String getProperty(String key);Bundle getBundle();Bundle installBundle(String location) throws BundleE xception;Bundle installBundle(String location, InputStream inp ut)

throws BundleException;Bundle getBundle(long id);Bundle getBundle(long id);Bundle[] getBundles();...void addBundleListener(BundleListener listener);void removeBundleListener(BundleListener listener);void addFrameworkListener(FrameworkListener listener );void removeFrameworkListener(FrameworkListener liste ner);...File getDataFile(String filename);...

}

67 OSGi in Action - Clement Escoffier

([email protected])

Page 68: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Context

� Represents the bundle's execution context

public interface BundleContext {String getProperty(String key);Bundle getBundle();Bundle installBundle(String location) throws BundleException;Bundle installBundle(String location, InputStream input)

throws BundleException;Bundle getBundle(long id);

Lifecycle method

to install other bundles

Bundle getBundle(long id);Bundle[] getBundles();...void addBundleListener(BundleListener listener);void removeBundleListener(BundleListener listener);void addFrameworkListener(FrameworkListener listener );void removeFrameworkListener(FrameworkListener liste ner);...File getDataFile(String filename);...

}

68 OSGi in Action - Clement Escoffier

([email protected])

Page 69: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Context

� Represents the bundle's execution context

public interface BundleContext {String getProperty(String key);Bundle getBundle();Bundle installBundle(String location) throws BundleE xception;Bundle installBundle(String location, InputStream inp ut)

throws BundleException;Bundle getBundle(long id); Access to otherBundle getBundle(long id);Bundle[] getBundles();...void addBundleListener(BundleListener listener);void removeBundleListener(BundleListener listener);void addFrameworkListener(FrameworkListener listener );void removeFrameworkListener(FrameworkListener liste ner);...File getDataFile(String filename);...

}

Access to other

installed bundles

69 OSGi in Action - Clement Escoffier

([email protected])

Page 70: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Context

� Represents the bundle's execution context

public interface BundleContext {String getProperty(String key);Bundle getBundle();Bundle installBundle(String location) throws BundleE xception;Bundle installBundle(String location, InputStream inp ut)

throws BundleException;Bundle getBundle(long id);

Access to our own bundle...

what's that?

Bundle getBundle(long id);Bundle[] getBundles();...void addBundleListener(BundleListener listener);void removeBundleListener(BundleListener listener);void addFrameworkListener(FrameworkListener listener );void removeFrameworkListener(FrameworkListener liste ner);...File getDataFile(String filename);...

}

70 OSGi in Action - Clement Escoffier

([email protected])

Page 71: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle

� Run-time representation of a bundlepublic interface Bundle {

...int getState();void start(int options) throws BundleException;void start() throws BundleException;void stop(int options) throws BundleException;void stop() throws BundleException;void update() throws BundleException ;void update() throws BundleException ;void update(InputStream in) throws BundleException;void uninstall() throws BundleException;Dictionary getHeaders();String getSymbolicName();long getBundleId();String getLocation();...URL getResource(String name);Enumeration getResources(String name) throws IOExcep tion;Class loadClass(String name) throws ClassNotFoundExc eption;...BundleContext getBundleContext();

} 71 OSGi in Action - Clement Escoffier

([email protected])

Page 72: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle

� Run-time representation of a bundlepublic interface Bundle {

...int getState();void start(int options) throws BundleException;void start() throws BundleException;void stop(int options) throws BundleException;void stop() throws BundleException;void update() throws BundleException;

Lifecycle method to

start bundle

void update(InputStream in) throws BundleException;void uninstall() throws BundleException;Dictionary getHeaders();String getSymbolicName();long getBundleId();String getLocation();...URL getResource(String name);Enumeration getResources(String name) throws IOExcep tion;Class loadClass(String name) throws ClassNotFoundExc eption;...BundleContext getBundleContext();

}72 OSGi in Action - Clement Escoffier

([email protected])

Page 73: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle

� Run-time representation of a bundlepublic interface Bundle {

...int getState();void start(int options) throws BundleException;void start() throws BundleException;void stop(int options) throws BundleException;void stop() throws BundleException;void update() throws BundleException;

Lifecycle method to

stop bundle

void update(InputStream in) throws BundleException;void uninstall() throws BundleException;Dictionary getHeaders();String getSymbolicName();long getBundleId();String getLocation();...URL getResource(String name);Enumeration getResources(String name) throws IOExcep tion;Class loadClass(String name) throws ClassNotFoundExc eption;...BundleContext getBundleContext();

}73 OSGi in Action - Clement Escoffier

([email protected])

Page 74: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle

� Run-time representation of a bundlepublic interface Bundle {

...int getState();void start(int options) throws BundleException;void start() throws BundleException;void stop(int options) throws BundleException;void stop() throws BundleException;void update() throws BundleException;void update() throws BundleException;void update(InputStream in) throws BundleException;void uninstall() throws BundleException;Dictionary getHeaders();String getSymbolicName();long getBundleId();String getLocation();...URL getResource(String name);Enumeration getResources(String name) throws IOExcep tion;Class loadClass(String name) throws ClassNotFoundExc eption;...BundleContext getBundleContext();

}

Lifecycle method to

update bundle

74 OSGi in Action - Clement Escoffier

([email protected])

Page 75: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle

� Run-time representation of a bundlepublic interface Bundle {

...int getState();void start(int options) throws BundleException;void start() throws BundleException;void stop(int options) throws BundleException;void stop() throws BundleException;void update() throws BundleException;void update(InputStream in) throws BundleException;void uninstall() throws BundleException;Dictionary getHeaders();String getSymbolicName();long getBundleId();String getLocation();...URL getResource(String name);Enumeration getResources(String name) throws IOExcep tion;Class loadClass(String name) throws ClassNotFoundExc eption;...BundleContext getBundleContext();

}

Lifecycle method to

uninstall bundle

75 OSGi in Action - Clement Escoffier

([email protected])

Page 76: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle

� Run-time representation of a bundlepublic interface Bundle {

...int getState();void start(int options) throws BundleException;void start() throws BundleException;void stop(int options) throws BundleException;void stop() throws BundleException;void update() throws BundleException;void update(InputStream in) throws BundleException;void uninstall() throws BundleException;Dictionary getHeaders();String getSymbolicName();long getBundleId();String getLocation();...URL getResource(String name);Enumeration getResources(String name) throws IOException;Class loadClass(String name) throws ClassNotFoundExc eption;...BundleContext getBundleContext();

}

Access to

bundle resources

76 OSGi in Action - Clement Escoffier

([email protected])

Page 77: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle

� Run-time representation of a bundlepublic interface Bundle {

...int getState();void start(int options) throws BundleException;void start() throws BundleException;void stop(int options) throws BundleException;void stop() throws BundleException;void update() throws BundleException;void update(InputStream in) throws BundleException;void uninstall() throws BundleException;Dictionary getHeaders();String getSymbolicName();long getBundleId();String getLocation();...URL getResource(String name);Enumeration getResources(String name) throws IOExcep tion;Class loadClass(String name) throws ClassNotFoundException;...BundleContext getBundleContext();

}

Access to

accessible classes

77 OSGi in Action - Clement Escoffier

([email protected])

Page 78: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Dynamism

� Bundles can be installed, started, stopped, updated, and

uninstalled at run time

� Bundle events signal lifecycle changes

To listen for eventsBundleContext.addBundleListener()

78 OSGi in Action - Clement Escoffier

([email protected])

Page 79: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Dynamism

� Bundles can be installed, started, stopped, updated, and

uninstalled at run time

� Bundle events signal lifecycle changes

Implement listener interfacepublic interface BundleListener extends EventListener {

public void bundleChanged(BundleEvent event);}}

79 OSGi in Action - Clement Escoffier

([email protected])

Page 80: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Dynamism

� Bundles can be installed, started, stopped, updated, and

uninstalled at run time

� Bundle events signal lifecycle changesReceived eventpublic class BundleEvent extends EventObject {

public final static int INSTALLED = 0x00000001;public final static int STARTED = 0x00000002;public final static int STARTED = 0x00000002;public final static int STOPPED = 0x00000004;public final static int UPDATED = 0x00000008;public final static int UNINSTALLED = 0x00000010;public final static int RESOLVED = 0x00000020;public final static int UNRESOLVED = 0x00000040;public final static int STARTING = 0x00000080;public final static int STOPPING = 0x00000100;…public Bundle getBundle() { … }public int getType() { … }

}80 OSGi in Action - Clement Escoffier

([email protected])

Page 81: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle-Based Dynamic Extensibility

� Bundle lifecycle events provide a mechanism for dynamic extensibility

� The extender pattern� An application component, called the extender, listens for bundles to be installed, started, and stopped

� On install, the extender probes bundles to see if they are extensions

� On install, the extender probes bundles to see if they are extensions

� Typically, extension contain special metadata or resources to indicate they provide an extension

� When started, the extender performs some action to integrate the extension into the application

� When stopped, the extender performs some action to remove the extension from the application

81 OSGi in Action - Clement Escoffier

([email protected])

Page 82: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Extender Pattern

Installed

bundles

OSGi in Action - Clement Escoffier

([email protected])82

Core

Tracker

Frame

Page 83: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Extender Pattern

Register

bundle listener

Installed

bundles

OSGi in Action - Clement Escoffier

([email protected])83

Core

Tracker

Frame

Page 84: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Extender Pattern

Install

bundle.jar

Installed

bundles

OSGi in Action - Clement Escoffier

([email protected])84

Core

Tracker

Frame

Page 85: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Extender Pattern

Create

logical bundle

Installed

bundles

OSGi in Action - Clement Escoffier

([email protected])85

Shape

implCore

Tracker

Frame

Page 86: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Extender Pattern

Installed

bundles

OSGi in Action - Clement Escoffier

([email protected])86

Shape

impl

Starting shape

bundle resolves itCore

Tracker

Frame

Page 87: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Extender Pattern

Bundle

start event

Installed

bundles

OSGi in Action - Clement Escoffier

([email protected])87

Shape

impl

start event

Core

Tracker

Frame

Page 88: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Extender Pattern

Installed

bundles

OSGi in Action - Clement Escoffier

([email protected])88

Shape

impl

Interrogate for metadata,

resources, classes, etc.

Core

Tracker

Frame

Page 89: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Extender Pattern

Installed

bundles

OSGi in Action - Clement Escoffier

([email protected])89

Shape

implCore

Tracker

Frame

inject

Page 90: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Extender Pattern

Installed

bundles

OSGi in Action - Clement Escoffier

([email protected])90

Shape

implFor the reverse, if the shape bundle

is stopped, the tracker removes its

associated shape.

Core

Tracker

Frame

Page 91: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Extender Paint Program Overview (1/2)

� Dynamically extensible paint program

� Uses the extender pattern to deliver shapes

� The paint bundle is the extender, i.e., it listens for bundles

containing shapes

� On install, the extender probes bundles to see if they are

extensionsextensions

� Special metadata in the manifest denotes the name, class, and icon of

the shape

� Uses placeholder when shape has been used, but

currently unavailable because the bundle is not active

91 OSGi in Action - Clement Escoffier

([email protected])

Page 92: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Extender Paint Program Design (1/2)

� Relationship among classes

DefaultShape

*ShapeTracker

1

1

1

1

PaintFrame

ShapeComponent

1

1

1 1

*

Circle Square Square

1

SimpleShape

1

92 OSGi in Action - Clement Escoffier

([email protected])

Page 93: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Extender Paint Program Design (2/2)

ShapePaint

export

org.foo.shape

Circ

le

Extension-Name:

Square

Tria

ngle

Extension-Name:

Circle

Extension-Class:

org.foo.shape.circle.Circle

Extension-Icon:

org/foo/shape/circle/circle.png

93 OSGi in Action - Clement Escoffier

([email protected])

Page 94: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Package Admin

� Framework provides special API to deal with bundles

interactions

public interface PackageAdmin {static final int BUNDLE_TYPE_FRAGMENT = 0x00000001;Bundle getBundle(Class clazz);Bundle[] getBundles(String symbolicName, String

versionRange );versionRange );int getBundleType(Bundle bundle);ExportedPackage getExportedPackage(String name);ExportedPackage[] getExportedPackages(Bundle bundle);ExportedPackage[] getExportedPackages(String name);Bundle[] getFragments(Bundle bundle);RequiredBundle[] getRequiredBundles(String symbolicName);Bundle[] getHosts(Bundle bundle);void refreshPackages(Bundle[] bundles);boolean resolveBundles(Bundle[] bundles);

}

94 OSGi in Action - Clement Escoffier

([email protected])

Page 95: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Package Admin

� Framework provides special API to deal with bundles

interactionspublic interface PackageAdmin {

static final int BUNDLE_TYPE_FRAGMENT = 0x00000001;Bundle getBundle(Class clazz);Bundle[] getBundles(String symbolicName, String

versionRange);int getBundleType(Bundle bundle);int getBundleType(Bundle bundle);ExportedPackage getExportedPackage(String name);ExportedPackage[] getExportedPackages(Bundle bundle);ExportedPackage[] getExportedPackages(String name);Bundle[] getFragments(Bundle bundle);RequiredBundle[] getRequiredBundles(String symbolicName);Bundle[] getHosts(Bundle bundle);void refreshPackages(Bundle[] bundles);boolean resolveBundles(Bundle[] bundles);

}

Provides various methods

to introspect bundle

dependencies

95 OSGi in Action - Clement Escoffier

([email protected])

Page 96: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Package Admin

� Framework provides special API to deal with bundles

interactionspublic interface PackageAdmin {

static final int BUNDLE_TYPE_FRAGMENT = 0x00000001;Bundle getBundle(Class clazz);Bundle[] getBundles(String symbolicName, String

versionRange);int getBundleType(Bundle bundle);int getBundleType(Bundle bundle);ExportedPackage getExportedPackage(String name);ExportedPackage[] getExportedPackages(Bundle bundle);ExportedPackage[] getExportedPackages(String name);Bundle[] getFragments(Bundle bundle);RequiredBundle[] getRequiredBundles(String symbolicName);Bundle[] getHosts(Bundle bundle);void refreshPackages(Bundle[] bundles);boolean resolveBundles(Bundle[] bundles);

}

So, how do we gain

access to this API?

96 OSGi in Action - Clement Escoffier

([email protected])

Page 97: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi in Action - Clement Escoffier ([email protected])97

Page 98: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Service Orientation

� The OSGi framework promotes a service-oriented

interaction pattern among bundles

98 OSGi in Action - Clement Escoffier

([email protected])

Page 99: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Service Orientation

� The OSGi framework promotes a service-oriented

interaction pattern among bundles

Service

RegistryRegistry

99 OSGi in Action - Clement Escoffier

([email protected])

Page 100: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Service Orientation

� The OSGi framework promotes a service-oriented

interaction pattern among bundles

Service

Registry

Publish

Registry

Service

Provider

Service

Description

100 OSGi in Action - Clement Escoffier

([email protected])

Page 101: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Service Orientation

� The OSGi framework promotes a service-oriented

interaction pattern among bundles

Service

Registry

Find

Service

Requester

Publish

Registry

Service

Provider

Service

Description

101 OSGi in Action - Clement Escoffier

([email protected])

Page 102: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Service Orientation

� The OSGi framework promotes a service-oriented

interaction pattern among bundles

Service

Registry

Find

Service

Requester

Publish

Registry

Service

Provider

Service

Description

Bind

102 OSGi in Action - Clement Escoffier

([email protected])

Page 103: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi Service Approach Advantages

� Lightweight services

� Direct method invocation

� Structured code

� Promotes separation of interface from implementation

� Enables reuse, substitutability, loose coupling, and late binding

Dynamics� Dynamics

� Loose coupling and late binding make it possible to support

run-time management of module

103 OSGi in Action - Clement Escoffier

([email protected])

Page 104: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi Applications

� A collection of bundles that interact via service interfaces

� Bundles may be independently developed and deployed

� Bundles and their associated services may appear or disappear

at any time

Resulting application follows a Service-Oriented � Resulting application follows a Service-Oriented

Component Model approach

� Combines ideas from both component and service orientation

104 OSGi in Action - Clement Escoffier

([email protected])

Page 105: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Life Cycle (Revisited)

INSTALLEDINSTALLED

RESOLVEDUNINSTALLED

install

updateuninstall resolve

uninstallRESOLVEDRESOLVEDUNINSTALLEDUNINSTALLED

STARTINGSTARTING STOPPINGSTOPPING

ACTIVEACTIVE

explicit

automatic

uninstall

start

stop

105 OSGi in Action - Clement Escoffier

([email protected])

Page 106: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Bundle Life Cycle (Revisited)

RESOLVEDUNINSTALLED

updateuninstall

uninstall

INSTALLED

install

resolveActivating a bundle allows it

to provide and use servicesRESOLVEDUNINSTALLED

explicit

automatic

uninstall

STARTING STOPPING

ACTIVEACTIVE

start

stop

106 OSGi in Action - Clement Escoffier

([email protected])

Page 107: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

What's a Service? (in OSGi)

� Just a simple Java object

� Typically described by a Java interface

� Allows for multiple providers

� Using a service is just like using any object

107 OSGi in Action - Clement Escoffier

([email protected])

Page 108: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Hello World Service Example

� Let's assume we have this service interfacepackage com.foo.hello;public interface Hello {

void sayHello(String name);}

108 OSGi in Action - Clement Escoffier

([email protected])

Page 109: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Hello World Service Example

� Let's assume we have this service interface

� And this implementation

package com.foo.hello;public interface Hello {

void sayHello(String name);}

� And this implementation

package com.foo.hello.impl;import com.foo.hello;public class HelloImpl implements Hello {

public void sayHello(String name) {System.out.println("Hello " + name + "!");

}}

109 OSGi in Action - Clement Escoffier

([email protected])

Page 110: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Publishing a Service (1/2)

� BundleContext allows bundles to publish services

public interface BundleContext {…void addServiceListener(ServiceListener listener, String

filter)throws InvalidSyntaxException;void addServiceListener(ServiceListener listener);void addServiceListener(ServiceListener listener);void removeServiceListener(ServiceListener listener);ServiceRegistration registerService(

String[] clazzes, Object service, Dictionary props);ServiceRegistration registerService(

String clazz, Object service, Dictionary props);ServiceReference[] getServiceReferences(String clazz, String

filter)throws InvalidSyntaxException;

ServiceReference getServiceReference(String clazz);Object getService(ServiceReference reference);boolean ungetService(ServiceReference reference);

}110 OSGi in Action - Clement Escoffier

([email protected])

Page 111: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Publishing a Service (1/2)

� BundleContext allows bundles to publish services

public interface BundleContext {…void addServiceListener(ServiceListener listener, String

filter)throws InvalidSyntaxException;void addServiceListener(ServiceListener listener);void addServiceListener(ServiceListener listener);void removeServiceListener(ServiceListener listener);ServiceRegistration registerService(String[] clazzes, Object service, Dictionary props);

ServiceRegistration registerService(String clazz, Object service, Dictionary props);

ServiceReference[] getServiceReferences(String clazz, String filter)

throws InvalidSyntaxException;ServiceReference getServiceReference(String clazz);Object getService(ServiceReference reference);boolean ungetService(ServiceReference reference);

}

We have two methods

for publishing services

111 OSGi in Action - Clement Escoffier

([email protected])

Page 112: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Publishing a Service (2/2)

� Bundles often publish services in their activator

package com.foo.hello.impl;import org.osgi.framework.*;public class Activator implements BundleActivator {

private ServiceRegistration m_reg = null;public void start(BundleContext context) {

m_reg = context.registerService (m_reg = context.registerService (com.foo.hello.Hello.class.getName(),

new HelloImpl(), null);}

public void stop(BundleContext context) {m_reg.unregister();

}}

112 OSGi in Action - Clement Escoffier

([email protected])

Page 113: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Publishing a Service (2/2)

� Bundles often publish services in their activator

package com.foo.hello.impl;import org.osgi.framework.*;public class Activator implements BundleActivator {

private ServiceRegistration m_reg = null;public void start(BundleContext context) {m_reg = context.registerService(m_reg = context.registerService(com.foo.hello.Hello.class.getName(),

new HelloImpl(), null);}

public void stop(BundleContext context) {m_reg.unregister();

}}

We register the service

when starting, which makes

it available to other

bundles

113 OSGi in Action - Clement Escoffier

([email protected])

Page 114: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Publishing a Service (2/2)

� Bundles often publish services in their activator

package com.foo.hello.impl;import org.osgi.framework.*;public class Activator implements BundleActivator {

private ServiceRegistration m_reg = null;public void start(BundleContext context) {

m_reg = context.registerService (m_reg = context.registerService (com.foo.hello.Hello.class.getName(), new HelloImpl(),

null);}

public void stop(BundleContext context) {m_reg.unregister();

}} We unregister it

when stopping

114 OSGi in Action - Clement Escoffier

([email protected])

Page 115: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Packaging the Hello World Service

� Our service implementation bundle contains these

packages

� com.foo.hello

� com.foo.hello.impl

115 OSGi in Action - Clement Escoffier

([email protected])

Page 116: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Packaging the Hello World Service

� Our service implementation bundle contains these

packages

� com.foo.hello

� com.foo.hello.impl

� And the following manifest metadataBundle - ManifestVersion : 2Bundle - ManifestVersion : 2Bundle-SymbolicName: com.foo.hello.implExport-Package: com.foo.helloImport-Package: org.osgi.framework, com.foo.helloBundle-Activator: com.foo.hello.impl.Activator

116 OSGi in Action - Clement Escoffier

([email protected])

Page 117: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Using a Service (1/2)

� BundleContext allows bundles to find services

public interface BundleContext {…void addServiceListener(ServiceListener listener, String

filter)throws InvalidSyntaxException;void addServiceListener(ServiceListener listener);void addServiceListener(ServiceListener listener);void removeServiceListener(ServiceListener listener);ServiceRegistration registerService(

String[] clazzes, Object service, Dictionary props);ServiceRegistration registerService(

String clazz, Object service, Dictionary props);ServiceReference[] getServiceReferences(String clazz, String

filter)throws InvalidSyntaxException;

ServiceReference getServiceReference(String clazz);Object getService(ServiceReference reference);boolean ungetService(ServiceReference reference);

}117 OSGi in Action - Clement Escoffier

([email protected])

Page 118: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Using a Service (1/2)

� BundleContext allows bundles to find services

public interface BundleContext {…void addServiceListener(ServiceListener listener, String

filter)throws InvalidSyntaxException;void addServiceListener(ServiceListener listener);

We have methods to findvoid addServiceListener(ServiceListener listener);void removeServiceListener(ServiceListener listener);ServiceRegistration registerService(

String[] clazzes, Object service, Dictionary props);ServiceRegistration registerService(

String clazz, Object service, Dictionary props);ServiceReference[] getServiceReferences(String clazz, String

filter)throws InvalidSyntaxException;

ServiceReference getServiceReference(String clazz);Object getService(ServiceReference reference);boolean ungetService(ServiceReference reference);

}

We have methods to find

service references and get

service objects

118 OSGi in Action - Clement Escoffier

([email protected])

Page 119: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Using a Service (2/2)

� Bundles retrieve service references

� Indirect references to service object

package com.foo.hello.client;import org.osgi.framework.*;import com.foo.hello.Hello;public class HelloClient implements BundleActivator {

public void start(BundleContext context) {ServiceReference ref = context.getServiceReference (ServiceReference ref = context.getServiceReference (

com.foo.hello.Hello.class.getName());if (ref != null) {

Hello h = (Hello) context.getService(ref);if (h != null) {

h.sayHello("World");context.ungetService(h);

}}

}…}

119 OSGi in Action - Clement Escoffier

([email protected])

Page 120: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Using a Service (2/2)

� Bundles retrieve service references

� Indirect references to service object

package com.foo.hello.client;import org.osgi.framework.*;import com.foo.hello.Hello;public class HelloClient implements BundleActivator {

public void start(BundleContext context) {ServiceReference ref = context.getServiceReference(ServiceReference ref = context.getServiceReference(

com.foo.hello.Hello.class.getName());if (ref != null) {

Hello h = (Hello) context.getService(ref);if (h != null) {

h.sayHello("World");context.ungetService(h);

}}

}…}

We first get the

service reference

120 OSGi in Action - Clement Escoffier

([email protected])

Page 121: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Using a Service (2/2)

� Bundles retrieve service references

� Indirect references to service object

package com.foo.hello.client;import org.osgi.framework.*;import com.foo.hello.Hello;public class HelloClient implements BundleActivator {

public void start(BundleContext context) {ServiceReference ref = context.getServiceReference (ServiceReference ref = context.getServiceReference (

com.foo.hello.Hello.class.getName());if (ref != null) {

Hello h = (Hello) context.getService(ref);if (h != null) {

h.sayHello("World");context.ungetService(h);

}}

}…}

From the service

reference we get the

service object

121 OSGi in Action - Clement Escoffier

([email protected])

Page 122: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Using a Service (2/2)

� Bundles retrieve service references

� Indirect references to service object

package com.foo.hello.client;import org.osgi.framework.*;import com.foo.hello.Hello;public class HelloClient implements BundleActivator {

public void start(BundleContext context) {ServiceReference ref = context.getServiceReference (ServiceReference ref = context.getServiceReference (

com.foo.hello.Hello.class.getName());if (ref != null) {

Hello h = (Hello) context.getService(ref);if (h != null) {

h.sayHello("World");context.ungetService(h);

}}

}…}

We use the service like

a normal object

122 OSGi in Action - Clement Escoffier

([email protected])

Page 123: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Using a Service (2/2)

� Bundles retrieve service references

� Indirect references to service object

package com.foo.hello.client;import org.osgi.framework.*;import com.foo.hello.Hello;public class HelloClient implements BundleActivator {

public void start(BundleContext context) {ServiceReference ref = context.getServiceReference (ServiceReference ref = context.getServiceReference (

com.foo.hello.Hello.class.getName());if (ref != null) {

Hello h = (Hello) context.getService(ref);if (h != null) {

h.sayHello("World");context.ungetService(h);

}}

}…}

And release the

service object when

we are done with it

123 OSGi in Action - Clement Escoffier

([email protected])

Page 124: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Packaging the Hello World Service

� Our client implementation bundle contains this package

� com.foo.hello.client

� And the following manifest metadata

Bundle-ManifestVersion: 2Bundle-SymbolicName: com.foo.hello.clientImport-Package: com.foo.hello, org.osgi.frameworkBundle-Activator: com.foo.hello.client.Activator

124 OSGi in Action - Clement Escoffier

([email protected])

Page 125: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Service Dynamism

� Services can be published and revoked at run time

� Service events signal service changes

� Must track events for any services being used

To listen for eventsBundleContext.addServiceListener()

125 OSGi in Action - Clement Escoffier

([email protected])

Page 126: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Services Dynamism

� Services can be published and revoked at run time

� Service events signal service changes

� Must track events for any services being used

Implement listener interfacepublic interface ServiceListener extends EventListener {

public void serviceChanged(ServiceEvent event);}}

126 OSGi in Action - Clement Escoffier

([email protected])

Page 127: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Services Dynamism

� Services can be published and revoked at run time

� Service events signal service changes

� Must track events for any services being used

Received eventpublic class ServiceEvent extends EventObject {

public final static int REGISTERED = 0x00000001;public final static int MODIFIED = 0x00000002;public final static int MODIFIED = 0x00000002;public final static int UNREGISTERING = 0x00000004;…public ServiceReference getServiceReference() { … }public int getType() { … }

}

127 OSGi in Action - Clement Escoffier

([email protected])

Page 128: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Services Dynamism

� Services can be published and revoked at run time

� Service events signal service changes

� Must track events for any services being used

Received eventpublic class ServiceEvent extends EventObject {

public final static int REGISTERED = 0x00000001;public final static int MODIFIED = 0x00000002;public final static int MODIFIED = 0x00000002;public final static int UNREGISTERING = 0x00000004;…public ServiceReference getServiceReference() { … }public int getType() { … }

} Even though are justEven though services are just

normal objects, they are

potentially much more

volatile, so service events

are very important

128 OSGi in Action - Clement Escoffier

([email protected])

Page 129: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Service-Based Dynamic Extensibility

� Service events provide a mechanism for dynamic

extensibility

� The whiteboard pattern

� Treats the service registry as a whiteboard

� A reverse way to create a service

An application component listens for services of a particular � An application component listens for services of a particular

type to be added and removed

� On addition, the service is integrated into the application

� On removal, the service is removed from the application

129 OSGi in Action - Clement Escoffier

([email protected])

Page 130: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Whiteboard Pattern

Framework

service registry

Shape

implCore

Tracker

Frame

130 OSGi in Action - Clement Escoffier

([email protected])

Page 131: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Whiteboard Pattern

Framework

service registry

Register

service listenerservice listener

Shape

implCore

Tracker

Frame

131 OSGi in Action - Clement Escoffier

([email protected])

Page 132: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Whiteboard Pattern

Service

publication

Framework

service registry

publication

Core

Tracker

Frame

Shape

impl

132 OSGi in Action - Clement Escoffier

([email protected])

Page 133: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Whiteboard Pattern

Framework

service registry

Service

event

Core

Tracker

Frame

Shape

impl

133 OSGi in Action - Clement Escoffier

([email protected])

Page 134: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Whiteboard Pattern

Framework

service registry

Service

requestrequest

Core

Tracker

Frame

Shape

impl

134 OSGi in Action - Clement Escoffier

([email protected])

Page 135: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Whiteboard Pattern

Framework

service registry

Service binding

Core

Tracker

Frame

Shape

impl

135 OSGi in Action - Clement Escoffier

([email protected])

Page 136: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Whiteboard Pattern

Framework

service registry

Core

Tracker

Frame

Shape

impl

136 OSGi in Action - Clement Escoffier

([email protected])

Page 137: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Whiteboard Pattern

Framework

service registry

For the reverse, if the shape service

is removed, the tracker removes its

associated shape.

Core

Tracker

Frame

Shape

impl

137 OSGi in Action - Clement Escoffier

([email protected])

Page 138: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Service Paint Program Overview

� Dynamically extensible paint program

� Uses the whiteboard pattern to deliver shapes

� The paint bundle listens for shape services that come and go

� Uses service properties for the name and icon of the shape

� Uses placeholder when shape has been used, but is

currently unavailable because the service is not availablecurrently unavailable because the service is not available

138 OSGi in Action - Clement Escoffier

([email protected])

Page 139: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Service Paint Program Design (1/2)

� Relationship between classes

DefaultShape

*ShapeTracker

1

1

1

1

PaintFrame

ShapeComponent

1

1

1 1

*

Circle Square Square

1

SimpleShape

1

139 OSGi in Action - Clement Escoffier

([email protected])

Page 140: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Service Paint Program Design (2/2)

ShapePaint

export

org.foo.shape

Circ

le

OSGi in Action - Clement Escoffier

([email protected])140

Square

Tria

ngle

Page 141: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Challenges of Dynamism

� Both bundles and services are dynamic

� OSGi is inherently multi-threaded

� This means you have to deal with the fact that

� Your application will likely see multiple threads

� Application components can appear or disappear at any timeApplication components can appear or disappear at any time

� There is help

� Service Tracker

� Declarative Services

141 OSGi in Action - Clement Escoffier

([email protected])

Page 142: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi in Action - Clement Escoffier ([email protected])142

Page 143: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Service-Component Model

� Why ?

� Simplification of the development model

� Dynamism

� Management

� Reconfiguration

� Architectural view

OSGi in Action - Clement Escoffier

([email protected])143

� Architectural view

� Allow to easily create sophisticated applications

Page 144: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Service-Component Model

� Why ?

� Simplification of the development model

� Dynamism

� Management

� Reconfiguration

� Architectural view

� Allow to easily create sophisticated applications

OSGi in Action - Clement Escoffier

([email protected])144

� Allow to easily create sophisticated applications

� Service-Component models

� Infuse service-oriented mechanisms in a component model

� Provide

� Simple development model

� Architectural views, composition mechanisms

Page 145: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Existing Service Component Models� Declarative Services� Specified in OSGi R4

� Define a declarative component model to deal with the service dynamism

� Spring Dynamic Modules� Spring on the top of OSGi

� Beans can use services and be exposed as services

OSGi in Action - Clement Escoffier

([email protected])145

� Beans can use services and be exposed as services

� Apache Felix iPOJO� POJO-based component model

� Extensible� Is not limited to dynamism

� Supports annotations

� The most advanced today

Page 146: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

OSGi in Action - Clement Escoffier ([email protected])146

Page 147: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Conclusions

� We've seen all OSGi has to offer

� Module layer

� Lifecycle layer

� Service layer

� Advanced service handling

� While there are plenty of more details to these layers,

you should now be familiar with the most important

parts

� The most commonly used/needed features

� The most commonly used patterns

147 OSGi in Action - Clement Escoffier

([email protected])

Page 148: OSGi in Action comasic - Télécom ParisTech · 2015-02-09 · Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios

Questions ?

OSGi in Action - Clement Escoffier

([email protected])148

Ada Diaconescu: ada.diaconescu_at_telecom-paristech.fr