SlideShare a Scribd company logo
1 of 49
Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

1 / 45
Programowanie Komponentowe
Wykład #D: Komponentowe aspekty OSGi
Mikołaj Olszewski
Wydział Zastosowań Informatyki i Matematyki
Szkoły Głównej Gospodarstwa Wiejskiego

7.01.2014

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

2 / 45
Plan wykładu

1

2

3

4

Komponenty w OSGi
Service-Oriented Component Model
Przykładowe zarządzanie zależnościami
Ulepszenia standardowego modelu komponentowego OSGi
Serwisy deklaratywne
Przykład
Greeting
Paint
Podsumowanie

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

3 / 45
Komponenty w OSGi

Plan wykładu

1

Komponenty w OSGi
Service-Oriented Component Model
Przykładowe zarządzanie zależnościami
Ulepszenia standardowego modelu komponentowego OSGi

2

Serwisy deklaratywne

3

Przykład

4

Podsumowanie

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

4 / 45
Komponenty w OSGi

Moduły a komponenty

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

5 / 45
Komponenty w OSGi

Moduły a komponenty
moduły

komponenty

udostępnianie i
konsumowanie kodu

udostępnianie i
konsumowanie kodu

oddzielne jednostki
uruchomieniowe

oddzielne jednostki
uruchomieniowe

zarządzają zależnościami

wymagają zewnętrznego
zarządzania (niekoniecznie
przez moduły)

zorientowane na statyczny
kod

zorientowane na instancje

zależności czasu
kompilacji

zależności czasu
wykonania
mogą być spakowane w
moduły

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

5 / 45
Komponenty w OSGi

Service-Oriented Component Model

Service-Oriented Component Model

Typ modelu komponentowego zdefiniowany w specyfikacji OSGi
SOCM
serwisowe powiązania czasu wykonania
wzorzec interakcji zorientowany na serwisy (publikacja, znalezienie,
powiązanie)
często wykorzystywany pełny dynamizm serwisów

Odwzorowania
paczka → komponent
serwis → interfejs komponentu

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

6 / 45
Komponenty w OSGi

Service-Oriented Component Model

Komponenty i ich interakcje

paczka + aktywator = komponent
Zewnętrzna konfiguracja: BundleContext.getProperty()
Logiczna jednostka (komponent) w fizycznej (plik JAR)
zazwyczaj odwzorowanie 1–1 jest łamane na rzecz n–1

Warstwa modułów
pełna dynamiczność
moduły: definiowanie zależności
komponenty: brak możliwości definiowania dostarczanych i
wymaganych interfejsów — ręczne zarządzanie

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

7 / 45
Komponenty w OSGi

Service-Oriented Component Model

Kompozycja komponentów
Brak jawnej możliwości definiowania interfejsów
Brak jawnego sposobu komponowania aplikacji
Aplikacja — zbiór wgranych paczek
Powiązania między interfejsami (dostarczanymi i wymaganymi) w
trakcie działania poprzez rejestr serwisów
późne rozwiązywanie zależności
pełna wymienność dostawców

Płynna kompozycja
elastyczne podejście
niskopoziomowe — powstanie frameworków i dodatków
komponentowych

Wzorzec interakcji zorientowany na serwisy →SOCM

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

8 / 45
Komponenty w OSGi

Przykładowe zarządzanie zależnościami

Prosta zależność

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

9 / 45
Komponenty w OSGi

Przykładowe zarządzanie zależnościami

Zarządzanie pojedynczą zależnością I
1
2
3
4
5

c l a s s BarTracker extends ServiceTracker {
p r i v a t e f i n a l FooImpl foo ;
p r i v a t e f i n a l BundleContext ctx ;
p r i v a t e L i s t <Bar> f o u n d = new L i n k e d L i s t <>() ;
private S e r v i c e R e g i s t r a t i o n reg ;

6
7
8
9

10

11

BarTracker ( FooImpl foo , BundleContext c t x ) {
s u p e r ( c t x , Bar . c l a s s . getName ( ) , n u l l ) ;
t h i s . foo = foo ;
this . ctx = ctx ;
}

12

13

14

15

16

17

18

19

20

@Override
p u b l i c Object addingService ( S e r v i c e R e f e r e n c e r e f e r e n c e ) {
Bar b a r = ( Bar ) s u p e r . a d d i n g S e r v i c e ( r e f e r e n c e ) ;
f o u n d . add ( b a r ) ;
i f ( f o o . g e t B a r ( ) == n u l l ) {
foo . setBar ( bar ) ;
r e g = c t x . r e g i s t e r S e r v i c e ( Foo . c l a s s . getName ( ) , f o o , n u l l ) ;
}
Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

10 / 45
Komponenty w OSGi

Przykładowe zarządzanie zależnościami

Zarządzanie pojedynczą zależnością II
return bar ;

21

}

22

23

@Override
p u b l i c void removedService ( S e r v i c e R e f e r e n c e reference , Object
service ) {
f o u n d . remove ( s e r v i c e ) ;
i f ( f o o . g e t B a r ( ) == s e r v i c e ) {
i f ( found . isEmpty ( ) ) {
reg . u n r e g i s t e r () ;
foo . setBar ( n u l l ) ;
reg = n u l l ;
}
else {
foo . setBar ( found . g e t F i r s t ( ) ) ;
}
}
super . removedService ( reference , s e r v i c e ) ;
}

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

}

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

11 / 45
Komponenty w OSGi

Ulepszenia standardowego modelu komponentowego OSGi

Ogólne podejście

metadane komponentu(-ów)
słuchacz modułów
komponent aktywny ⇒ moduł
aktywny
cykl życia komponentu
oddzielnie zarządzany przez
framework
uzależniony od wymaganych
interfejsów
wywołania zwrotne

zazwyczaj brak aktywatora

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

12 / 45
Komponenty w OSGi

Ulepszenia standardowego modelu komponentowego OSGi

Automatyczne zarządzanie serwisami
Zarządzanie zależnościami
uproszczenie
redukcja kodu

Opis serwisów
1
2

wymagane
dostarczane

Opis zależności
typ serwisu
opcjonalność
liczność
wpływ na cykl życia
statyczny
dynamiczny

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

13 / 45
Serwisy deklaratywne

Plan wykładu

1

Komponenty w OSGi

2

Serwisy deklaratywne

3

Przykład

4

Podsumowanie

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

14 / 45
Serwisy deklaratywne

Wprowadzenie

Wprowadzone w wersji R4
Lekkie podejście do zarządzania
zależnościami serwisów
publikacją serwisów

Rozwiązanie problemów
czas startu
narzut pamięci
złożoność

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

15 / 45
Serwisy deklaratywne

Budowa komponentów

Zwykła paczka OSGi
Aktywator niepotrzebny
Opis komponentu
Service-Component: OSGI-INF/component.xml
Service-Component:
OSGI-INF/component1.xml,OSGI-INF/component2.xml
Service-Component: OSGI-INF/*.xml

Interfejs w tej samej paczce lub oddzielnej

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

16 / 45
Serwisy deklaratywne

Dostarczanie serwisu

1
2
3
4
5
6
7
8

<? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?>
<s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ”>
<p r o p e r t y name=” j a k a s . nazwa ” v a l u e=” j a k a s . w a r t o s c ” />
<i m p l e m e n t a t i o n c l a s s=” o r g . f o o . S e r v i c e I m p l ” />
< s e r v i c e>
<p r o v i d e i n t e r f a c e=” o r g . f o o . S e r v i c e ” />
</ s e r v i c e>
</ s c r : c o m p o n e n t>

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

17 / 45
Serwisy deklaratywne

Konsumpcja serwisu

1
2
3
4
5
6
7
8
9

10

<? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?>
<s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ” />
<i m p l e m e n t a t i o n c l a s s=” o r g . f o o . C l i e n t ” />
<r e f e r e n c e
i n t e r f a c e=” o r g . f o o . S e r v i c e ”
c a r d i n a l i t y =” 0 . . n ”
p o l i c y=” dy na mi c ”
b i n d=” b i n d S e r v i c e ”
u n b i n d=” u n b i n d S e r v i c e ” />
</ s c r : c o m p o n e n t>

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

18 / 45
Serwisy deklaratywne

Metody wiążące

Sygnatury
void <method-name>(ServiceReference);
void <method-name>(<service-type>);
void <method-name>(<service-type>, Map);

Ograniczenie dostępu (może być pakietowy)

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

19 / 45
Serwisy deklaratywne

Cykl życia komponentu

enabled
satisfied
activated
modified
deactivated

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

20 / 45
Serwisy deklaratywne

Wywołania zwrotne

1
2
3
4

<component name=” o r g . f o o . e x a m p l e ”
a c t i v a t e=” s t a r t ”
m o d i f i e d=” m o d i f i e d ”
d e a c t i v a t e=” s t o p ”>

Domyślne nazwy: activate() i deactivate()
Parametry [0..4]
ComponentContext
BundleContext
Map
int

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

21 / 45
Serwisy deklaratywne

Wyszukiwanie serwisów
1
2
3
4
5

<r e f e r e n c e
i n t e r f a c e=” o r g . f o o . S e r v i c e ”
c a r d i n a l i t y =” 0 . . n ”
p o l i c y=” dy na mi c ”
name=” f o o S e r v i c e ” />

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

22 / 45
Serwisy deklaratywne

Wyszukiwanie serwisów
1
2
3
4
5

1
2
3
4
5
6
7
8
9

<r e f e r e n c e
i n t e r f a c e=” o r g . f o o . S e r v i c e ”
c a r d i n a l i t y =” 0 . . n ”
p o l i c y=” dy na mi c ”
name=” f o o S e r v i c e ” />
L i s t <S e r v i c e > f i n d S e r v i c e s ( ComponentContext c t x ) {
L i s t <S e r v i c e > l i s t = new L i s t <>() ;
Object [ ] s e r v i c e s = ctx . l o c a t e S e r v i c e s ( ” f o o S e r v i c e ” ) ;
f o r ( Object s : s e r v i c e s ) {
Service service = ( Service ) s ;
l i s t . add ( s e r v i c e ) ;
}
return l i s t ;
}

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

22 / 45
Serwisy deklaratywne

Wyszukiwanie serwisów
1
2
3
4
5

1
2
3
4
5
6
7
8
9

<r e f e r e n c e
i n t e r f a c e=” o r g . f o o . S e r v i c e ”
c a r d i n a l i t y =” 0 . . n ”
p o l i c y=” dy na mi c ”
name=” f o o S e r v i c e ” />
L i s t <S e r v i c e > f i n d S e r v i c e s ( ComponentContext c t x ) {
L i s t <S e r v i c e > l i s t = new L i s t <>() ;
Object [ ] s e r v i c e s = ctx . l o c a t e S e r v i c e s ( ” f o o S e r v i c e ” ) ;
f o r ( Object s : s e r v i c e s ) {
Service service = ( Service ) s ;
l i s t . add ( s e r v i c e ) ;
}
return l i s t ;
}

Object locateService(String)
Object locateService(String, ServiceReference)
Object[] locateServices(String)
Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

22 / 45
Serwisy deklaratywne

Fabryki komponentów I

1

<component x m l n s=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ” f a c t o r y=”
f o o S e r v i c e . f a c t o r y ” name=” f o o S e r v i c e ”>

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

23 / 45
Serwisy deklaratywne

Fabryki komponentów I

1

<component x m l n s=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ” f a c t o r y=”
f o o S e r v i c e . f a c t o r y ” name=” f o o S e r v i c e ”>

1

<r e f e r e n c e
name=” f o o S e r v i c e ”
i n t e r f a c e=” o r g . o s g i . s e r v i c e . component . C o m p o n e n t F a c t o r y ”
t a r g e t=” ( component . f a c t o r y=f o o S e r v i c e . f a c t o r y ) ”
c a r d i n a l i t y =” 1 . . 1 ”
p o l i c y=” dy na mi c ”
b i n d=” a d d F o o S e r v i c e F a c t o r y ”
u n b i n d=” r e m o v e F o o S e r v i c e F a c t o r y ” />

2
3
4
5
6
7
8

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

23 / 45
Serwisy deklaratywne

Fabryki komponentów II
1

i m p o r t o r g . o s g i . s e r v i c e . component . C o m p o n e n t F a c t o r y ;

2
3
4

p u b l i c c l a s s FooManager {
p r i v a t e A t o m i c R e f e r e n c e <ComponentFactory > f a c t o r y R e f = new
A t o m i c R e f e r e n c e <ComponentFactory >() ;

5

v o i d a d d F o o S e r v i c e F a c t o r y ( ComponentFactory f a c t o r y ) {
factoryRef . set ( factory ) ;
}

6
7
8
9

v o i d r e m o v e F o o S e r v i c e F a c t o r y ( ComponentFactory f a c t o r y ) {
factoryRef . set ( null ) ;
}

10

11

12

13

p u b l i c S e r v i c e c r e a t e F o o S e r v i c e ( S t r i n g name ) {
ComponentFactory f a c t o r y = f a c t o r y R e f . get ( ) ;
i f ( f a c t o r y == n u l l )
throw new I l l e g a l S t a t e E x c e p t i o n ( ”No f a c t o r y
H a s h t a b l e c o n f i g = new H a s h t a b l e ( ) ;
c o n f i g . s e t ( ” name ” , name ) ;
return factory . newInstance ( config ) ;
}

14

15

16

17

18

19

20

21

22

}

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

registered ”) ;

Wykład #D

24 / 45
Przykład

Plan wykładu

1

Komponenty w OSGi

2

Serwisy deklaratywne

3

4

Przykład
Greeting
Paint
Podsumowanie

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

25 / 45
Przykład

Greeting

Diagram komponentów

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

26 / 45
Przykład

Greeting

Opis komponentu serwisu

1
2
3
4
5
6
7
8

<? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?>
<s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ”
name=” g r e e t i n g ”>
<i m p l e m e n t a t i o n c l a s s=” pk . demos . o s g i . h e l l o . p r o v i d e r . i m p l .
G r e e t i n g I m p l ” />
< s e r v i c e>
<p r o v i d e i n t e r f a c e=” pk . demos . o s g i . h e l l o . p r o v i d e r . G r e e t i n g ” />
</ s e r v i c e>
<p r o p e r t y name=” name ” t y p e=” S t r i n g ” v a l u e=” D e c l a r a t i v e S e r v i c e ” />
</ s c r : c o m p o n e n t>

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

27 / 45
Przykład

Greeting

Serwis

1

public interface Greeting {

2

void sayHello () ;

3
4
5

}

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

28 / 45
Przykład

Greeting

Implementacja serwisu

1
2

p u b l i c c l a s s G r e e t i n g I m p l implements G r e e t i n g {
p r i v a t e S t r i n g name ;

3

v o i d a c t i v a t e ( ComponentContext c o n t e x t ) {
name = ( S t r i n g ) c o n t e x t . g e t P r o p e r t i e s ( ) . g e t ( ” name ” ) ;
}

4
5
6
7

@Override
public void sayHello () {
System . o u t . p r i n t l n ( ” W i t a j ” + name + ” ! ” ) ;
}

8
9

10

11

12

}

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

29 / 45
Przykład

Greeting

Opis komponentu klienta

1
2
3
4
5
6
7
8
9

10

<? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?>
<s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ”
name=” c l i e n t ”>
<i m p l e m e n t a t i o n c l a s s=” pk . demos . o s g i . h e l l o . c l i e n t . C l i e n t ” />
<r e f e r e n c e
b i n d=” b i n d G r e e t i n g ”
c a r d i n a l i t y =” 1 . . 1 ”
i n t e r f a c e=” pk . demos . o s g i . h e l l o . p r o v i d e r . G r e e t i n g ”
name=” g r e e t i n g ”
p o l i c y=” s t a t i c ” />
</ s c r : c o m p o n e n t>

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

30 / 45
Przykład

Greeting

Implementacja klienta

1

public class Client {

2

public void bindGreeting ( Greeting greeting ) {
greeting . sayHello () ;
}

3
4
5
6

}

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

31 / 45
Przykład

Paint

Diagram komponentów

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

32 / 45
Przykład

Paint

Serwis

1

p u b l i c i n t e r f a c e SimpleShape {

2

public static
public static

3
4

final
final

S t r i n g NAME PROPERTY = ” s i m p l e . s h a p e . name ” ;
S t r i n g ICON PROPERTY = ” s i m p l e . s h a p e . i c o n ” ;

5

p u b l i c v o i d draw ( G r a p h i c s 2 D g2 , P o i n t p ) ;

6
7
8

}

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

33 / 45
Przykład

Paint

Opis komponentu koła

1
2
3
4
5
6
7
8
9

<? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?>
<s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ”
name=” s h a p e . c i r c l e ”>
<i m p l e m e n t a t i o n c l a s s=” pk . demos . o s g i . s h a p e . c i r c l e . C i r c l e ” />
<p r o p e r t y name=” s i m p l e . s h a p e . name ” t y p e=” S t r i n g ” v a l u e=” C i r c l e ” /
>
<p r o p e r t y name=” s i m p l e . s h a p e . i c o n ” t y p e=” S t r i n g ” v a l u e=” c i r c l e .
png ” />
< s e r v i c e>
<p r o v i d e i n t e r f a c e=” pk . demos . o s g i . s h a p e . S i m p l e S h a p e ” />
</ s e r v i c e>
</ s c r : c o m p o n e n t>

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

34 / 45
Przykład

Paint

Opis komponentu okienka

1
2
3
4
5
6
7
8
9

10

11

12

13

14

15

<? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?>
<s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ”
i m m e d i a t e=” t r u e ” name=” p a i n t ”>
<i m p l e m e n t a t i o n c l a s s=” pk . demos . o s g i . p a i n t . P a i n t F r a m e ” />
<r e f e r e n c e
b i n d=” addShape ”
c a r d i n a l i t y =” 0 . . n ”
i n t e r f a c e=” pk . demos . o s g i . s h a p e . S i m p l e S h a p e ”
name=” S i m p l e S h a p e ”
p o l i c y=” dy na mi c ”
u n b i n d=” removeShape ” />
< s e r v i c e>
<p r o v i d e i n t e r f a c e=” j a v a . awt . Window” />
</ s e r v i c e>
<p r o p e r t y name=” name ” t y p e=” S t r i n g ” v a l u e=” main ” />
</ s c r : c o m p o n e n t>

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

35 / 45
Przykład

Paint

Implementacja okienka I

1
2
3
4
5

p u b l i c c l a s s P a i n t F r a m e e x t e n d s JFrame . . . {
...
v o i d a c t i v a t e (Map<S t r i n g ,? > p r o p e r t i e s ) {
I n t e g e r width = ( I n t e g e r ) p r o p e r t i e s . get ( ” width ” ) ;
I n t e g e r height = ( I n t e g e r ) p r o p e r t i e s . get ( ” height ” ) ;

6

// u s t a w i e n i e r o z m i a r o w i p o k a z a n i e okna

7
8

}

9

10

11

12

void deactivate () {
// z a m k n i e c i e okna
}

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

36 / 45
Przykład

Paint

Implementacja okienka II
v o i d addShape ( S i m p l e S h a p e s h a p e , Map<S t r i n g ,? > a t t r s ) {
f i n a l D e f a u l t S h a p e d e l e g a t e = new D e f a u l t S h a p e ( s h a p e ) ;
f i n a l S t r i n g name = ( S t r i n g ) a t t r s . g e t ( S i m p l e S h a p e . NAME PROPERTY
);
f i n a l I c o n i c o n = new I m a g e I c o n ( s h a p e . g e t C l a s s ( ) . g e t R e s o u r c e ( (
S t r i n g ) a t t r s . g e t ( S i m p l e S h a p e . ICON PROPERTY) ) ) ;

1
2
3
4
5

s h a p e s . p u t ( name , d e l e g a t e ) ;
// d o d a n i e p r z y c i s k u na p a s k u n a r z e d z i o w y m

6
7

}

8
9

v o i d removeShape ( S i m p l e S h a p e s h a p e , Map<S t r i n g ,? > a t t r s ) {
f i n a l S t r i n g name = ( S t r i n g ) a t t r s . g e t ( S i m p l e S h a p e . NAME PROPERTY
);

10

11

12

D e f a u l t S h a p e d e l e g a t e = s h a p e s . remove ( name ) ;

13

14

i f ( d e l e g a t e != n u l l ) {
delegate . dispose () ;
// u s u n i e c i e p r z y c i s k u
}

15

16

17

18

}

19

20

}

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

37 / 45
Przykład

Paint

Opis komponentu słuchacza
1
2
3
4
5
6
7
8
9

10

11

12

13

14

15

16

17

18

19

<? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?>
<s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ”
name=” w i n d o w l i s t e n e r ”>
<i m p l e m e n t a t i o n c l a s s=” pk . demos . o s g i . w i n d o w l i s t e n e r .
W i n d o w L i s t e n e r ” />
<r e f e r e n c e
b i n d=” bindWindow ”
c a r d i n a l i t y =” 1 . . 1 ”
i n t e r f a c e=” j a v a . awt . Window”
name=” window ”
p o l i c y=” s t a t i c ”
t a r g e t=” ( name=main ) ”
u n b i n d=” unbindWindow ” />
<r e f e r e n c e
b i n d=” b i n d L o g ”
c a r d i n a l i t y =” 0 . . 1 ”
i n t e r f a c e=” o r g . o s g i . s e r v i c e . l o g . L o g S e r v i c e ”
name=” L o g S e r v i c e ”
p o l i c y=” dy na mi c ”
u n b i n d=” u n b i n d L o g ” />
</ s c r : c o m p o n e n t>
Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

38 / 45
Przykład

Paint

Implementacja słuchacza I
1

p u b l i c c l a s s W i n d o w L i s t e n e r e x t e n d s WindowAdapter {

2
3
4

p r i v a t e BundleContext context ;
p r i v a t e A t o m i c R e f e r e n c e <L o g S e r v i c e > l o g R e f = new A t o m i c R e f e r e n c e <
L o g S e r v i c e >() ;

5
6
7
8

void a c t i v a t e ( BundleContext context ) {
this . context = context ;
}

9

10

11

12

void deactivate () {
context = null ;
}

13

14

15

16

void bindLog ( LogService log ) {
l o g R e f . compareAndSet ( n u l l , l o g ) ;
}

17

18

19

void unbindLog ( L o g S e r v i c e l o g ) {
l o g R e f . compareAndSet ( l o g , n u l l ) ;
Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

39 / 45
20

Przykład

Paint

Implementacja słuchacza II
}

21

22

23

24

25

v o i d bindWindow ( Window window ) {
l o g ( L o g S e r v i c e . LOG INFO , ” P r z y p i s a n i e okna ” ) ;
window . a d d W i n d o w L i s t e n e r ( t h i s ) ;
}

26

27

28

29

30

v o i d unbindWindow ( Window window ) {
l o g ( L o g S e r v i c e . LOG INFO , ” S k a s o w a n i e okna ” ) ;
window . r e m o v e W i n d o w L i s t e n e r ( t h i s ) ;
}

31

32

33

34

35

36

37

38

39

40

@Override
p u b l i c v o i d w i n d o w C l o s e d ( WindowEvent e v t ) {
try {
l o g ( L o g S e r v i c e . LOG INFO , ” Z a m k n i e c i e okna ” ) ;
context . getBundle (0) . stop () ;
} catch ( BundleException e ) {
l o g ( L o g S e r v i c e . LOG ERROR , ” B l a d : ” + e . g e t M e s s a g e ( ) ) ;
}
}
Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

40 / 45
Przykład

Paint

Implementacja słuchacza III

41

p r i v a t e v o i d l o g ( i n t l e v e l , S t r i n g message ) {
LogService log = logRef . get () ;
i f ( l o g != n u l l ) {
l o g . l o g ( l e v e l , message ) ;
}
}

42

43

44

45

46

47

48

}

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

41 / 45
Podsumowanie

Plan wykładu

1

Komponenty w OSGi

2

Serwisy deklaratywne

3

Przykład

4

Podsumowanie

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

42 / 45
Podsumowanie

Podsumowanie

Service-Oriented Component Model
Pełna dynamiczność oraz podejście niskopoziomowe
Serwisy deklaratywne
lekkie środowisko komponentowe
duże ułatwienia dla programistów

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

43 / 45
Podsumowanie

Do domu

Przyswoić w praktyce używanie serwisów deklaratywnych
Zrozumieć strukturę projektów osgi (w tym pliki osgi.properties
i katalogi OSGI-INF)
Zapoznać się z parametrami komponentów

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

44 / 45
Podsumowanie

Mikołaj Olszewski (WZIM SGGW)

Programowanie Komponentowe

Wykład #D

45 / 45

More Related Content

Viewers also liked

Optoelektroniczne modelowanie sieci neuronowej cz. 1
Optoelektroniczne modelowanie sieci neuronowej cz. 1Optoelektroniczne modelowanie sieci neuronowej cz. 1
Optoelektroniczne modelowanie sieci neuronowej cz. 1Mikołaj Olszewski
 
Programowanie Komponentowe: #B Komponentowe aspekty springa
Programowanie Komponentowe: #B Komponentowe aspekty springaProgramowanie Komponentowe: #B Komponentowe aspekty springa
Programowanie Komponentowe: #B Komponentowe aspekty springaMikołaj Olszewski
 
The metadata driven e-laboratory web client
The metadata driven e-laboratory web clientThe metadata driven e-laboratory web client
The metadata driven e-laboratory web clientMikołaj Olszewski
 
Programowanie Komponentowe: #6 Wersjonowanie
Programowanie Komponentowe: #6 WersjonowanieProgramowanie Komponentowe: #6 Wersjonowanie
Programowanie Komponentowe: #6 WersjonowanieMikołaj Olszewski
 
Programowanie Komponentowe: #E Podsumowanie
Programowanie Komponentowe: #E PodsumowanieProgramowanie Komponentowe: #E Podsumowanie
Programowanie Komponentowe: #E PodsumowanieMikołaj Olszewski
 
Kwantowe struktury półprzewodnikowe
Kwantowe struktury półprzewodnikoweKwantowe struktury półprzewodnikowe
Kwantowe struktury półprzewodnikoweMikołaj Olszewski
 
Optyczne solitony przestrzenne
Optyczne solitony przestrzenneOptyczne solitony przestrzenne
Optyczne solitony przestrzenneMikołaj Olszewski
 
Programowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieProgramowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieMikołaj Olszewski
 

Viewers also liked (13)

Optoelektroniczne modelowanie sieci neuronowej cz. 1
Optoelektroniczne modelowanie sieci neuronowej cz. 1Optoelektroniczne modelowanie sieci neuronowej cz. 1
Optoelektroniczne modelowanie sieci neuronowej cz. 1
 
Programowanie Komponentowe: #B Komponentowe aspekty springa
Programowanie Komponentowe: #B Komponentowe aspekty springaProgramowanie Komponentowe: #B Komponentowe aspekty springa
Programowanie Komponentowe: #B Komponentowe aspekty springa
 
The metadata driven e-laboratory web client
The metadata driven e-laboratory web clientThe metadata driven e-laboratory web client
The metadata driven e-laboratory web client
 
Programowanie Komponentowe: #6 Wersjonowanie
Programowanie Komponentowe: #6 WersjonowanieProgramowanie Komponentowe: #6 Wersjonowanie
Programowanie Komponentowe: #6 Wersjonowanie
 
Parallel quicksort cz. 2
Parallel quicksort cz. 2Parallel quicksort cz. 2
Parallel quicksort cz. 2
 
Materiały fotorefrakcyjne
Materiały fotorefrakcyjneMateriały fotorefrakcyjne
Materiały fotorefrakcyjne
 
Programowanie Komponentowe: #E Podsumowanie
Programowanie Komponentowe: #E PodsumowanieProgramowanie Komponentowe: #E Podsumowanie
Programowanie Komponentowe: #E Podsumowanie
 
Kwantowe struktury półprzewodnikowe
Kwantowe struktury półprzewodnikoweKwantowe struktury półprzewodnikowe
Kwantowe struktury półprzewodnikowe
 
Optyczne solitony przestrzenne
Optyczne solitony przestrzenneOptyczne solitony przestrzenne
Optyczne solitony przestrzenne
 
Programowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieProgramowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 Wprowadzenie
 
Architektura heksagonalna
Architektura heksagonalnaArchitektura heksagonalna
Architektura heksagonalna
 
Lokalne sieci światłowodowe
Lokalne sieci światłowodoweLokalne sieci światłowodowe
Lokalne sieci światłowodowe
 
Optyka ciekłych kryształów
Optyka ciekłych kryształówOptyka ciekłych kryształów
Optyka ciekłych kryształów
 

Similar to Programowanie Komponentowe: #D Model komponentowy OSGi

Programowanie Komponentowe: #2 Metody opisu komponentów
Programowanie Komponentowe: #2 Metody opisu komponentówProgramowanie Komponentowe: #2 Metody opisu komponentów
Programowanie Komponentowe: #2 Metody opisu komponentówMikołaj Olszewski
 
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETProgramowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETMikołaj Olszewski
 
PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...
PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...
PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...PROIDEA
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPROIDEA
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLThe Software House
 
Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Marcin Grzybowski
 
Programowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie komponentowe: #4 Podstawy połączeń komponentówProgramowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie komponentowe: #4 Podstawy połączeń komponentówMikołaj Olszewski
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?Brainhub
 
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...Gawel Mikolajczyk
 
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13RxJS okiem doświadczonego inżyniera - Angular Warsaw #13
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13Piotr Kowalski
 
OSGi, deklaratywnie
OSGi, deklaratywnieOSGi, deklaratywnie
OSGi, deklaratywnieCode-House
 
Architektura to nie bzdura
Architektura to nie bzduraArchitektura to nie bzdura
Architektura to nie bzduraPawel Szulc
 
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznieSages
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJSSages
 
AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)Marcin Baran
 
Jak włamałem się do banku
Jak włamałem się do bankuJak włamałem się do banku
Jak włamałem się do bankuSlawomir Jasek
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychMarcin Jasiński
 
ELO DMS - prezentacja polska
ELO DMS - prezentacja polskaELO DMS - prezentacja polska
ELO DMS - prezentacja polskaWojciech Hodura
 
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMKopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMArtur Skowroński
 

Similar to Programowanie Komponentowe: #D Model komponentowy OSGi (20)

Programowanie Komponentowe: #2 Metody opisu komponentów
Programowanie Komponentowe: #2 Metody opisu komponentówProgramowanie Komponentowe: #2 Metody opisu komponentów
Programowanie Komponentowe: #2 Metody opisu komponentów
 
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETProgramowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
 
PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...
PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...
PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
 
Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)
 
Isyp07
Isyp07Isyp07
Isyp07
 
Programowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie komponentowe: #4 Podstawy połączeń komponentówProgramowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie komponentowe: #4 Podstawy połączeń komponentów
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?
 
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
 
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13RxJS okiem doświadczonego inżyniera - Angular Warsaw #13
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13
 
OSGi, deklaratywnie
OSGi, deklaratywnieOSGi, deklaratywnie
OSGi, deklaratywnie
 
Architektura to nie bzdura
Architektura to nie bzduraArchitektura to nie bzdura
Architektura to nie bzdura
 
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznie
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJS
 
AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)
 
Jak włamałem się do banku
Jak włamałem się do bankuJak włamałem się do banku
Jak włamałem się do banku
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów Sparkowych
 
ELO DMS - prezentacja polska
ELO DMS - prezentacja polskaELO DMS - prezentacja polska
ELO DMS - prezentacja polska
 
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMKopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
 

More from Mikołaj Olszewski

More from Mikołaj Olszewski (10)

Optoelektroniczne sieci neuronowe
Optoelektroniczne sieci neuronoweOptoelektroniczne sieci neuronowe
Optoelektroniczne sieci neuronowe
 
Swiatłowodowy czujnik prądu
Swiatłowodowy czujnik prąduSwiatłowodowy czujnik prądu
Swiatłowodowy czujnik prądu
 
Metody efektywnego łączenia sieci neuronowych
Metody efektywnego łączenia sieci neuronowychMetody efektywnego łączenia sieci neuronowych
Metody efektywnego łączenia sieci neuronowych
 
Parallel quicksort cz. 1
Parallel quicksort cz. 1Parallel quicksort cz. 1
Parallel quicksort cz. 1
 
Maszyna Turinga
Maszyna TuringaMaszyna Turinga
Maszyna Turinga
 
Planowanie działań cz. 2
Planowanie działań cz. 2Planowanie działań cz. 2
Planowanie działań cz. 2
 
Planowanie działań cz. 1
Planowanie działań cz. 1Planowanie działań cz. 1
Planowanie działań cz. 1
 
Model hierarchiczny
Model hierarchicznyModel hierarchiczny
Model hierarchiczny
 
Komputer genetyczny
Komputer genetycznyKomputer genetyczny
Komputer genetyczny
 
Test wyszukiwarek internetowych
Test wyszukiwarek internetowychTest wyszukiwarek internetowych
Test wyszukiwarek internetowych
 

Programowanie Komponentowe: #D Model komponentowy OSGi

  • 1. Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 1 / 45
  • 2. Programowanie Komponentowe Wykład #D: Komponentowe aspekty OSGi Mikołaj Olszewski Wydział Zastosowań Informatyki i Matematyki Szkoły Głównej Gospodarstwa Wiejskiego 7.01.2014 Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 2 / 45
  • 3. Plan wykładu 1 2 3 4 Komponenty w OSGi Service-Oriented Component Model Przykładowe zarządzanie zależnościami Ulepszenia standardowego modelu komponentowego OSGi Serwisy deklaratywne Przykład Greeting Paint Podsumowanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 3 / 45
  • 4. Komponenty w OSGi Plan wykładu 1 Komponenty w OSGi Service-Oriented Component Model Przykładowe zarządzanie zależnościami Ulepszenia standardowego modelu komponentowego OSGi 2 Serwisy deklaratywne 3 Przykład 4 Podsumowanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 4 / 45
  • 5. Komponenty w OSGi Moduły a komponenty Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 5 / 45
  • 6. Komponenty w OSGi Moduły a komponenty moduły komponenty udostępnianie i konsumowanie kodu udostępnianie i konsumowanie kodu oddzielne jednostki uruchomieniowe oddzielne jednostki uruchomieniowe zarządzają zależnościami wymagają zewnętrznego zarządzania (niekoniecznie przez moduły) zorientowane na statyczny kod zorientowane na instancje zależności czasu kompilacji zależności czasu wykonania mogą być spakowane w moduły Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 5 / 45
  • 7. Komponenty w OSGi Service-Oriented Component Model Service-Oriented Component Model Typ modelu komponentowego zdefiniowany w specyfikacji OSGi SOCM serwisowe powiązania czasu wykonania wzorzec interakcji zorientowany na serwisy (publikacja, znalezienie, powiązanie) często wykorzystywany pełny dynamizm serwisów Odwzorowania paczka → komponent serwis → interfejs komponentu Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 6 / 45
  • 8. Komponenty w OSGi Service-Oriented Component Model Komponenty i ich interakcje paczka + aktywator = komponent Zewnętrzna konfiguracja: BundleContext.getProperty() Logiczna jednostka (komponent) w fizycznej (plik JAR) zazwyczaj odwzorowanie 1–1 jest łamane na rzecz n–1 Warstwa modułów pełna dynamiczność moduły: definiowanie zależności komponenty: brak możliwości definiowania dostarczanych i wymaganych interfejsów — ręczne zarządzanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 7 / 45
  • 9. Komponenty w OSGi Service-Oriented Component Model Kompozycja komponentów Brak jawnej możliwości definiowania interfejsów Brak jawnego sposobu komponowania aplikacji Aplikacja — zbiór wgranych paczek Powiązania między interfejsami (dostarczanymi i wymaganymi) w trakcie działania poprzez rejestr serwisów późne rozwiązywanie zależności pełna wymienność dostawców Płynna kompozycja elastyczne podejście niskopoziomowe — powstanie frameworków i dodatków komponentowych Wzorzec interakcji zorientowany na serwisy →SOCM Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 8 / 45
  • 10. Komponenty w OSGi Przykładowe zarządzanie zależnościami Prosta zależność Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 9 / 45
  • 11. Komponenty w OSGi Przykładowe zarządzanie zależnościami Zarządzanie pojedynczą zależnością I 1 2 3 4 5 c l a s s BarTracker extends ServiceTracker { p r i v a t e f i n a l FooImpl foo ; p r i v a t e f i n a l BundleContext ctx ; p r i v a t e L i s t <Bar> f o u n d = new L i n k e d L i s t <>() ; private S e r v i c e R e g i s t r a t i o n reg ; 6 7 8 9 10 11 BarTracker ( FooImpl foo , BundleContext c t x ) { s u p e r ( c t x , Bar . c l a s s . getName ( ) , n u l l ) ; t h i s . foo = foo ; this . ctx = ctx ; } 12 13 14 15 16 17 18 19 20 @Override p u b l i c Object addingService ( S e r v i c e R e f e r e n c e r e f e r e n c e ) { Bar b a r = ( Bar ) s u p e r . a d d i n g S e r v i c e ( r e f e r e n c e ) ; f o u n d . add ( b a r ) ; i f ( f o o . g e t B a r ( ) == n u l l ) { foo . setBar ( bar ) ; r e g = c t x . r e g i s t e r S e r v i c e ( Foo . c l a s s . getName ( ) , f o o , n u l l ) ; } Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 10 / 45
  • 12. Komponenty w OSGi Przykładowe zarządzanie zależnościami Zarządzanie pojedynczą zależnością II return bar ; 21 } 22 23 @Override p u b l i c void removedService ( S e r v i c e R e f e r e n c e reference , Object service ) { f o u n d . remove ( s e r v i c e ) ; i f ( f o o . g e t B a r ( ) == s e r v i c e ) { i f ( found . isEmpty ( ) ) { reg . u n r e g i s t e r () ; foo . setBar ( n u l l ) ; reg = n u l l ; } else { foo . setBar ( found . g e t F i r s t ( ) ) ; } } super . removedService ( reference , s e r v i c e ) ; } 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 } Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 11 / 45
  • 13. Komponenty w OSGi Ulepszenia standardowego modelu komponentowego OSGi Ogólne podejście metadane komponentu(-ów) słuchacz modułów komponent aktywny ⇒ moduł aktywny cykl życia komponentu oddzielnie zarządzany przez framework uzależniony od wymaganych interfejsów wywołania zwrotne zazwyczaj brak aktywatora Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 12 / 45
  • 14. Komponenty w OSGi Ulepszenia standardowego modelu komponentowego OSGi Automatyczne zarządzanie serwisami Zarządzanie zależnościami uproszczenie redukcja kodu Opis serwisów 1 2 wymagane dostarczane Opis zależności typ serwisu opcjonalność liczność wpływ na cykl życia statyczny dynamiczny Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 13 / 45
  • 15. Serwisy deklaratywne Plan wykładu 1 Komponenty w OSGi 2 Serwisy deklaratywne 3 Przykład 4 Podsumowanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 14 / 45
  • 16. Serwisy deklaratywne Wprowadzenie Wprowadzone w wersji R4 Lekkie podejście do zarządzania zależnościami serwisów publikacją serwisów Rozwiązanie problemów czas startu narzut pamięci złożoność Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 15 / 45
  • 17. Serwisy deklaratywne Budowa komponentów Zwykła paczka OSGi Aktywator niepotrzebny Opis komponentu Service-Component: OSGI-INF/component.xml Service-Component: OSGI-INF/component1.xml,OSGI-INF/component2.xml Service-Component: OSGI-INF/*.xml Interfejs w tej samej paczce lub oddzielnej Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 16 / 45
  • 18. Serwisy deklaratywne Dostarczanie serwisu 1 2 3 4 5 6 7 8 <? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?> <s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ”> <p r o p e r t y name=” j a k a s . nazwa ” v a l u e=” j a k a s . w a r t o s c ” /> <i m p l e m e n t a t i o n c l a s s=” o r g . f o o . S e r v i c e I m p l ” /> < s e r v i c e> <p r o v i d e i n t e r f a c e=” o r g . f o o . S e r v i c e ” /> </ s e r v i c e> </ s c r : c o m p o n e n t> Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 17 / 45
  • 19. Serwisy deklaratywne Konsumpcja serwisu 1 2 3 4 5 6 7 8 9 10 <? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?> <s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ” /> <i m p l e m e n t a t i o n c l a s s=” o r g . f o o . C l i e n t ” /> <r e f e r e n c e i n t e r f a c e=” o r g . f o o . S e r v i c e ” c a r d i n a l i t y =” 0 . . n ” p o l i c y=” dy na mi c ” b i n d=” b i n d S e r v i c e ” u n b i n d=” u n b i n d S e r v i c e ” /> </ s c r : c o m p o n e n t> Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 18 / 45
  • 20. Serwisy deklaratywne Metody wiążące Sygnatury void <method-name>(ServiceReference); void <method-name>(<service-type>); void <method-name>(<service-type>, Map); Ograniczenie dostępu (może być pakietowy) Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 19 / 45
  • 21. Serwisy deklaratywne Cykl życia komponentu enabled satisfied activated modified deactivated Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 20 / 45
  • 22. Serwisy deklaratywne Wywołania zwrotne 1 2 3 4 <component name=” o r g . f o o . e x a m p l e ” a c t i v a t e=” s t a r t ” m o d i f i e d=” m o d i f i e d ” d e a c t i v a t e=” s t o p ”> Domyślne nazwy: activate() i deactivate() Parametry [0..4] ComponentContext BundleContext Map int Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 21 / 45
  • 23. Serwisy deklaratywne Wyszukiwanie serwisów 1 2 3 4 5 <r e f e r e n c e i n t e r f a c e=” o r g . f o o . S e r v i c e ” c a r d i n a l i t y =” 0 . . n ” p o l i c y=” dy na mi c ” name=” f o o S e r v i c e ” /> Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 22 / 45
  • 24. Serwisy deklaratywne Wyszukiwanie serwisów 1 2 3 4 5 1 2 3 4 5 6 7 8 9 <r e f e r e n c e i n t e r f a c e=” o r g . f o o . S e r v i c e ” c a r d i n a l i t y =” 0 . . n ” p o l i c y=” dy na mi c ” name=” f o o S e r v i c e ” /> L i s t <S e r v i c e > f i n d S e r v i c e s ( ComponentContext c t x ) { L i s t <S e r v i c e > l i s t = new L i s t <>() ; Object [ ] s e r v i c e s = ctx . l o c a t e S e r v i c e s ( ” f o o S e r v i c e ” ) ; f o r ( Object s : s e r v i c e s ) { Service service = ( Service ) s ; l i s t . add ( s e r v i c e ) ; } return l i s t ; } Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 22 / 45
  • 25. Serwisy deklaratywne Wyszukiwanie serwisów 1 2 3 4 5 1 2 3 4 5 6 7 8 9 <r e f e r e n c e i n t e r f a c e=” o r g . f o o . S e r v i c e ” c a r d i n a l i t y =” 0 . . n ” p o l i c y=” dy na mi c ” name=” f o o S e r v i c e ” /> L i s t <S e r v i c e > f i n d S e r v i c e s ( ComponentContext c t x ) { L i s t <S e r v i c e > l i s t = new L i s t <>() ; Object [ ] s e r v i c e s = ctx . l o c a t e S e r v i c e s ( ” f o o S e r v i c e ” ) ; f o r ( Object s : s e r v i c e s ) { Service service = ( Service ) s ; l i s t . add ( s e r v i c e ) ; } return l i s t ; } Object locateService(String) Object locateService(String, ServiceReference) Object[] locateServices(String) Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 22 / 45
  • 26. Serwisy deklaratywne Fabryki komponentów I 1 <component x m l n s=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ” f a c t o r y=” f o o S e r v i c e . f a c t o r y ” name=” f o o S e r v i c e ”> Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 23 / 45
  • 27. Serwisy deklaratywne Fabryki komponentów I 1 <component x m l n s=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ” f a c t o r y=” f o o S e r v i c e . f a c t o r y ” name=” f o o S e r v i c e ”> 1 <r e f e r e n c e name=” f o o S e r v i c e ” i n t e r f a c e=” o r g . o s g i . s e r v i c e . component . C o m p o n e n t F a c t o r y ” t a r g e t=” ( component . f a c t o r y=f o o S e r v i c e . f a c t o r y ) ” c a r d i n a l i t y =” 1 . . 1 ” p o l i c y=” dy na mi c ” b i n d=” a d d F o o S e r v i c e F a c t o r y ” u n b i n d=” r e m o v e F o o S e r v i c e F a c t o r y ” /> 2 3 4 5 6 7 8 Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 23 / 45
  • 28. Serwisy deklaratywne Fabryki komponentów II 1 i m p o r t o r g . o s g i . s e r v i c e . component . C o m p o n e n t F a c t o r y ; 2 3 4 p u b l i c c l a s s FooManager { p r i v a t e A t o m i c R e f e r e n c e <ComponentFactory > f a c t o r y R e f = new A t o m i c R e f e r e n c e <ComponentFactory >() ; 5 v o i d a d d F o o S e r v i c e F a c t o r y ( ComponentFactory f a c t o r y ) { factoryRef . set ( factory ) ; } 6 7 8 9 v o i d r e m o v e F o o S e r v i c e F a c t o r y ( ComponentFactory f a c t o r y ) { factoryRef . set ( null ) ; } 10 11 12 13 p u b l i c S e r v i c e c r e a t e F o o S e r v i c e ( S t r i n g name ) { ComponentFactory f a c t o r y = f a c t o r y R e f . get ( ) ; i f ( f a c t o r y == n u l l ) throw new I l l e g a l S t a t e E x c e p t i o n ( ”No f a c t o r y H a s h t a b l e c o n f i g = new H a s h t a b l e ( ) ; c o n f i g . s e t ( ” name ” , name ) ; return factory . newInstance ( config ) ; } 14 15 16 17 18 19 20 21 22 } Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe registered ”) ; Wykład #D 24 / 45
  • 29. Przykład Plan wykładu 1 Komponenty w OSGi 2 Serwisy deklaratywne 3 4 Przykład Greeting Paint Podsumowanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 25 / 45
  • 30. Przykład Greeting Diagram komponentów Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 26 / 45
  • 31. Przykład Greeting Opis komponentu serwisu 1 2 3 4 5 6 7 8 <? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?> <s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ” name=” g r e e t i n g ”> <i m p l e m e n t a t i o n c l a s s=” pk . demos . o s g i . h e l l o . p r o v i d e r . i m p l . G r e e t i n g I m p l ” /> < s e r v i c e> <p r o v i d e i n t e r f a c e=” pk . demos . o s g i . h e l l o . p r o v i d e r . G r e e t i n g ” /> </ s e r v i c e> <p r o p e r t y name=” name ” t y p e=” S t r i n g ” v a l u e=” D e c l a r a t i v e S e r v i c e ” /> </ s c r : c o m p o n e n t> Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 27 / 45
  • 32. Przykład Greeting Serwis 1 public interface Greeting { 2 void sayHello () ; 3 4 5 } Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 28 / 45
  • 33. Przykład Greeting Implementacja serwisu 1 2 p u b l i c c l a s s G r e e t i n g I m p l implements G r e e t i n g { p r i v a t e S t r i n g name ; 3 v o i d a c t i v a t e ( ComponentContext c o n t e x t ) { name = ( S t r i n g ) c o n t e x t . g e t P r o p e r t i e s ( ) . g e t ( ” name ” ) ; } 4 5 6 7 @Override public void sayHello () { System . o u t . p r i n t l n ( ” W i t a j ” + name + ” ! ” ) ; } 8 9 10 11 12 } Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 29 / 45
  • 34. Przykład Greeting Opis komponentu klienta 1 2 3 4 5 6 7 8 9 10 <? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?> <s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ” name=” c l i e n t ”> <i m p l e m e n t a t i o n c l a s s=” pk . demos . o s g i . h e l l o . c l i e n t . C l i e n t ” /> <r e f e r e n c e b i n d=” b i n d G r e e t i n g ” c a r d i n a l i t y =” 1 . . 1 ” i n t e r f a c e=” pk . demos . o s g i . h e l l o . p r o v i d e r . G r e e t i n g ” name=” g r e e t i n g ” p o l i c y=” s t a t i c ” /> </ s c r : c o m p o n e n t> Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 30 / 45
  • 35. Przykład Greeting Implementacja klienta 1 public class Client { 2 public void bindGreeting ( Greeting greeting ) { greeting . sayHello () ; } 3 4 5 6 } Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 31 / 45
  • 36. Przykład Paint Diagram komponentów Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 32 / 45
  • 37. Przykład Paint Serwis 1 p u b l i c i n t e r f a c e SimpleShape { 2 public static public static 3 4 final final S t r i n g NAME PROPERTY = ” s i m p l e . s h a p e . name ” ; S t r i n g ICON PROPERTY = ” s i m p l e . s h a p e . i c o n ” ; 5 p u b l i c v o i d draw ( G r a p h i c s 2 D g2 , P o i n t p ) ; 6 7 8 } Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 33 / 45
  • 38. Przykład Paint Opis komponentu koła 1 2 3 4 5 6 7 8 9 <? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?> <s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ” name=” s h a p e . c i r c l e ”> <i m p l e m e n t a t i o n c l a s s=” pk . demos . o s g i . s h a p e . c i r c l e . C i r c l e ” /> <p r o p e r t y name=” s i m p l e . s h a p e . name ” t y p e=” S t r i n g ” v a l u e=” C i r c l e ” / > <p r o p e r t y name=” s i m p l e . s h a p e . i c o n ” t y p e=” S t r i n g ” v a l u e=” c i r c l e . png ” /> < s e r v i c e> <p r o v i d e i n t e r f a c e=” pk . demos . o s g i . s h a p e . S i m p l e S h a p e ” /> </ s e r v i c e> </ s c r : c o m p o n e n t> Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 34 / 45
  • 39. Przykład Paint Opis komponentu okienka 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?> <s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ” i m m e d i a t e=” t r u e ” name=” p a i n t ”> <i m p l e m e n t a t i o n c l a s s=” pk . demos . o s g i . p a i n t . P a i n t F r a m e ” /> <r e f e r e n c e b i n d=” addShape ” c a r d i n a l i t y =” 0 . . n ” i n t e r f a c e=” pk . demos . o s g i . s h a p e . S i m p l e S h a p e ” name=” S i m p l e S h a p e ” p o l i c y=” dy na mi c ” u n b i n d=” removeShape ” /> < s e r v i c e> <p r o v i d e i n t e r f a c e=” j a v a . awt . Window” /> </ s e r v i c e> <p r o p e r t y name=” name ” t y p e=” S t r i n g ” v a l u e=” main ” /> </ s c r : c o m p o n e n t> Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 35 / 45
  • 40. Przykład Paint Implementacja okienka I 1 2 3 4 5 p u b l i c c l a s s P a i n t F r a m e e x t e n d s JFrame . . . { ... v o i d a c t i v a t e (Map<S t r i n g ,? > p r o p e r t i e s ) { I n t e g e r width = ( I n t e g e r ) p r o p e r t i e s . get ( ” width ” ) ; I n t e g e r height = ( I n t e g e r ) p r o p e r t i e s . get ( ” height ” ) ; 6 // u s t a w i e n i e r o z m i a r o w i p o k a z a n i e okna 7 8 } 9 10 11 12 void deactivate () { // z a m k n i e c i e okna } Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 36 / 45
  • 41. Przykład Paint Implementacja okienka II v o i d addShape ( S i m p l e S h a p e s h a p e , Map<S t r i n g ,? > a t t r s ) { f i n a l D e f a u l t S h a p e d e l e g a t e = new D e f a u l t S h a p e ( s h a p e ) ; f i n a l S t r i n g name = ( S t r i n g ) a t t r s . g e t ( S i m p l e S h a p e . NAME PROPERTY ); f i n a l I c o n i c o n = new I m a g e I c o n ( s h a p e . g e t C l a s s ( ) . g e t R e s o u r c e ( ( S t r i n g ) a t t r s . g e t ( S i m p l e S h a p e . ICON PROPERTY) ) ) ; 1 2 3 4 5 s h a p e s . p u t ( name , d e l e g a t e ) ; // d o d a n i e p r z y c i s k u na p a s k u n a r z e d z i o w y m 6 7 } 8 9 v o i d removeShape ( S i m p l e S h a p e s h a p e , Map<S t r i n g ,? > a t t r s ) { f i n a l S t r i n g name = ( S t r i n g ) a t t r s . g e t ( S i m p l e S h a p e . NAME PROPERTY ); 10 11 12 D e f a u l t S h a p e d e l e g a t e = s h a p e s . remove ( name ) ; 13 14 i f ( d e l e g a t e != n u l l ) { delegate . dispose () ; // u s u n i e c i e p r z y c i s k u } 15 16 17 18 } 19 20 } Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 37 / 45
  • 42. Przykład Paint Opis komponentu słuchacza 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?> <s c r : c o m p o n e n t x m l n s : s c r=” h t t p : //www . o s g i . o r g / x m l n s / s c r / v1 . 1 . 0 ” name=” w i n d o w l i s t e n e r ”> <i m p l e m e n t a t i o n c l a s s=” pk . demos . o s g i . w i n d o w l i s t e n e r . W i n d o w L i s t e n e r ” /> <r e f e r e n c e b i n d=” bindWindow ” c a r d i n a l i t y =” 1 . . 1 ” i n t e r f a c e=” j a v a . awt . Window” name=” window ” p o l i c y=” s t a t i c ” t a r g e t=” ( name=main ) ” u n b i n d=” unbindWindow ” /> <r e f e r e n c e b i n d=” b i n d L o g ” c a r d i n a l i t y =” 0 . . 1 ” i n t e r f a c e=” o r g . o s g i . s e r v i c e . l o g . L o g S e r v i c e ” name=” L o g S e r v i c e ” p o l i c y=” dy na mi c ” u n b i n d=” u n b i n d L o g ” /> </ s c r : c o m p o n e n t> Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 38 / 45
  • 43. Przykład Paint Implementacja słuchacza I 1 p u b l i c c l a s s W i n d o w L i s t e n e r e x t e n d s WindowAdapter { 2 3 4 p r i v a t e BundleContext context ; p r i v a t e A t o m i c R e f e r e n c e <L o g S e r v i c e > l o g R e f = new A t o m i c R e f e r e n c e < L o g S e r v i c e >() ; 5 6 7 8 void a c t i v a t e ( BundleContext context ) { this . context = context ; } 9 10 11 12 void deactivate () { context = null ; } 13 14 15 16 void bindLog ( LogService log ) { l o g R e f . compareAndSet ( n u l l , l o g ) ; } 17 18 19 void unbindLog ( L o g S e r v i c e l o g ) { l o g R e f . compareAndSet ( l o g , n u l l ) ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 39 / 45
  • 44. 20 Przykład Paint Implementacja słuchacza II } 21 22 23 24 25 v o i d bindWindow ( Window window ) { l o g ( L o g S e r v i c e . LOG INFO , ” P r z y p i s a n i e okna ” ) ; window . a d d W i n d o w L i s t e n e r ( t h i s ) ; } 26 27 28 29 30 v o i d unbindWindow ( Window window ) { l o g ( L o g S e r v i c e . LOG INFO , ” S k a s o w a n i e okna ” ) ; window . r e m o v e W i n d o w L i s t e n e r ( t h i s ) ; } 31 32 33 34 35 36 37 38 39 40 @Override p u b l i c v o i d w i n d o w C l o s e d ( WindowEvent e v t ) { try { l o g ( L o g S e r v i c e . LOG INFO , ” Z a m k n i e c i e okna ” ) ; context . getBundle (0) . stop () ; } catch ( BundleException e ) { l o g ( L o g S e r v i c e . LOG ERROR , ” B l a d : ” + e . g e t M e s s a g e ( ) ) ; } } Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 40 / 45
  • 45. Przykład Paint Implementacja słuchacza III 41 p r i v a t e v o i d l o g ( i n t l e v e l , S t r i n g message ) { LogService log = logRef . get () ; i f ( l o g != n u l l ) { l o g . l o g ( l e v e l , message ) ; } } 42 43 44 45 46 47 48 } Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 41 / 45
  • 46. Podsumowanie Plan wykładu 1 Komponenty w OSGi 2 Serwisy deklaratywne 3 Przykład 4 Podsumowanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 42 / 45
  • 47. Podsumowanie Podsumowanie Service-Oriented Component Model Pełna dynamiczność oraz podejście niskopoziomowe Serwisy deklaratywne lekkie środowisko komponentowe duże ułatwienia dla programistów Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 43 / 45
  • 48. Podsumowanie Do domu Przyswoić w praktyce używanie serwisów deklaratywnych Zrozumieć strukturę projektów osgi (w tym pliki osgi.properties i katalogi OSGI-INF) Zapoznać się z parametrami komponentów Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 44 / 45
  • 49. Podsumowanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #D 45 / 45