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
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
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
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
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