41
!"#$%&'&()"* Marcel Oermans Dependencies, dependencies, dependencies 1

OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Embed Size (px)

Citation preview

Page 1: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

!"#$%&'&()"*

Marcel Offermans

Dependencies, dependencies, dependencies

1

Page 2: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Marcel Offermans• Fellow and Software Architect at

Luminis [email protected]

• Member and Committer at Apache Software [email protected]

2

Page 3: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Agenda• Introduction• Basic Concepts• Dependencies• Design Patterns• Custom Dependencies• Add-ons• Wrap-up

3

Page 4: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Agenda• Introduction• Basic Concepts• Dependencies• Design Patterns• Custom Dependencies• Add-ons• Wrap-up

Software distribution:copy both zip archives from the memory stick

3

Page 5: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Introduction

4

Page 6: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Framework

!"#"$%&'()"*$+",-&./

012&$3'"4/56'7

1/,)'&(8

+69)*/

:&3/$,8,*/

1/'#&,/;).9*/ ;).9*/ ;).9*/

5

Page 7: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Service Dependencies• framework: ServiceListener

– notification whenever there is a change in the service registry

– but: only changes that occur while you are listening

• utility: ServiceTracker– solves the listening issue– adds ability to customize services

6

Page 8: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Problem• using the framework supplied

tooling, you are dealing with dependencies at a very low level

• a lot of boiler plate code is needed to implement real world scenarios

• there are very few design patterns that deal with composing an application based on services

7

Page 9: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Declaring your dependencies• Service Binder• Dependency Manager• Declarative Services• iPOJO• Blueprint• ...many more

8

Page 10: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Dependency Manager• Subproject of Apache Felix• Nearing a 3.0 release• Some interesting new features

...I’m not unbiased, being it’s author

9

Page 11: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Basic Concepts

10

Page 12: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Basic Concepts• Component: class that implements

certain behaviour (a POJO)• Dependency: something our

component needs or wants (ie. a service)

• Service: OSGi service interface(s) under which our component is registered

11

Page 13: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Declarative API• Declarative ≠ XML• Using a Java API has many

advantages:– less error prone because of syntax and

compile time checking– refactoring support, completion– very readable through fluid API– everything in one place, no magic

12

Page 14: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Example code• Projects

– Download: http://www.xs4all.nl/~mfo/projects.zip

• Uses Eclipse + BndTools– Homepage: http://njbartlett.name/bndtools.html– Update Site: http://bndtools-updates.s3.amazonaws.com

• Based on a snapshot release of the upcoming Dependency Manager 3.0

• During the presentation, we will switch between slides and Eclipse to show running examples

13

Page 15: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Example code• Projects

– Download: http://www.xs4all.nl/~mfo/projects.zip

• Uses Eclipse + BndTools– Homepage: http://njbartlett.name/bndtools.html– Update Site: http://bndtools-updates.s3.amazonaws.com

• Based on a snapshot release of the upcoming Dependency Manager 3.0

• During the presentation, we will switch between slides and Eclipse to show running examples

On the memory stick:

a) an Eclipse update site for BndToolsb) a set of Eclipse projects

13

Page 16: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Using the Dependency Manager

public class Activator extends DependencyActivatorBase { public void init(BundleContext context, DependencyManager manager) throws Exception { manager.add(createComponent() .setImplementation(new HelloWorld()) ); }

public void destroy(BundleContext context, DependencyManager manager) throws Exception { }}

Import-Package = org.apache.felix.dm;version="[3.0,4)"

14

Page 17: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Basic Use Cases• Declare a component

• Declare it lazily

HelloWorld helloWorld = new HelloWorld(); manager.add(createComponent() .setImplementation(helloWorld) );

manager.add(createComponent() .setImplementation(HelloWorld.class) );

15

Page 18: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Component Life Cycle• methods of the component

• setCallbacks(“init”, “start”, ...)setCallbacks(inst, “init”, “start”, ...)– to invoke the methods on ‘inst’

• ComponentStateListener– if you want to listen from the outside

public static class HelloWorldLifeCycle { private void init() { System.out.println("init"); } private void start() { System.out.println("start"); } private void stop() { System.out.println("stop"); } private void destroy() { System.out.println("destroy"); } }

16

Page 19: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Declaring as a service• setInterface(...)

– allows you to declare multiple services– allows you to specify service properties

manager.add(createComponent() .setInterface(LogService.class.getName(), new Properties() {{ put(Constants.SERVICE_RANKING, 20); }}) .setImplementation(MyLogService.class)

17

Page 20: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Declaring Dependencies• Adding a dependency

• Injects dependency– uses null object pattern– injects other “OSGi” instances

• setCallbacks(...)setCallbacks(inst, ...)

manager.add(createComponent() .setImplementation(HelloWorldLogger.class) .add(createServiceDependency() .setService(LogService.class) ) );

18

Page 21: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Dependencies

19

Page 22: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Dependencies• Different types:

– Service Dependencies– Configuration Dependencies– Bundle Dependencies– Resource Dependencies

20

Page 23: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Configuration Dependencies• Based on Configuration Admin

– designed for required dependencies– service.pid to identify the configuration– allows you to only accept *valid*

configurations• update() throws ConfigurationException

21

Page 24: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Bundle Dependencies• Depend on a bundle:

– in certain states– with certain manifest entries

• Bundle instance can be injected

22

Page 25: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Resource Dependencies• Resources are modeled as URLs• Are provided by a repository

– another bundle– an Eclipse workspace– some external source

• Filter on host, port, protocol, path and URL

23

Page 26: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Design Patterns

24

Page 27: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Design Patterns• Moving up a level in abstraction• OSGi is too low level to expose to

everybody, but it is a great platform to build on

• Patterns provide a common language and describe solutions in context

25

Page 28: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Overview of Design Patterns• Whiteboard Pattern• Null Object Pattern• “Singleton” Service• Aspect Service• Adapter Service• Resource Adapter Service

26

Page 29: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Whiteboard Pattern

“don’t  call  us...we’ll  call  you”

27

Page 30: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Null Object Pattern• An object that implements a certain

interface, can be safely invoked and does nothing

28

Page 31: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

“Singleton” Service• Publishes a component as a service• Ties its life cycle to that of its

dependencies

get()getVersions()get(version)store(Document)

Document Repository

Singleton

Storagerequires

29

Page 32: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Aspect Service• Works at the service level• “intercepts” certain services• can be chained based on rankings• completely dynamic

get()getVersions()get(version)store(Document)

Repository CacheAspect

get()getVersions()get(version)store(Document)

Repository

intercepts

30

Page 33: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Adapter Service• Works on existing services• Adapts them, publishes a different

service for each existing one

getCacheHits()setSize()setTTL()flush()

Repository CacheManageable

Adapter

get()getVersions()get(version)store(Document)

Repository Cache

adapts

31

Page 34: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Resource Adapter Service• Adapts resources (instead of

services)• Allows you to expose the behavior

of certain resources instead of their “inner guts”

play()pause()stop()

Audio TrackResourceAdapter

MP3Fileadapts

32

Page 35: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Custom Dependencies

33

Page 36: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Custom Dependencies• Dependency Manager is extensible

with custom dependencies:– depend on time of day– depend on some custom instance /

condition (start level, app state)

34

Page 37: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Add-ons

35

Page 38: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Add-ons• Shell (Felix, Equinox, Gogo)• Annotation based (Java 5 required)• Legacy support (2.x API adapter)

36

Page 39: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Wrap-up

37

Page 40: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

Wrap-up• Points to take away:

– do not expose every developer to the OSGi API

– build higher level abstractions, use design patterns

– consider the dependency manager, it is very flexible

38

Page 41: OSGi Community Event 2010 - Dependencies, dependencies, dependencies

More about OSGi• ApacheCon 2010 North America

November 1-5, Atlanta– OSGi tutorial– full day OSGi track

• Masterclass on OSGiOctober 12-15, Girona– Neil Bartlett and Peter Kriens

39