!"#$%&'&()*+,-&./)&0*./& - - PowerPoint PPT Presentation
!"#$%&'&()*+,-&./)&0*./& - - PowerPoint PPT Presentation
!"#$%&'&()*+,-&./)&0*./& !"#$#%&'()*+,#-.'/0123%#&'4565' 1/2.&23+4.&5)&6& & ! 7+"28+%'4-*93&#*&'3%'&9#':+;2"/-'/%;':+<3"#'!!' ! 4=/*9#'7+>?/-#'@+2%;/8+%' A
1/2.&23+4.&5)&6&
& ! 7+"28+%'4-*93&#*&'3%'&9#':+;2"/-'/%;':+<3"#'!!' ! 4=/*9#'7+>?/-#'@+2%;/8+%' A B:!'4=/*9#'@#"3C.''4=/*9#'4*#' A 4=/*9#'@#"3C'3BDED'=-+F#*&'"#/;#-' ! DGH' A !9/$#"#+%'=-+F#*&'"#/;#-' ! 4'"+&'+I'+&9#-)'*+%&-3<28+%)'' A $/J#%K/%;-+3;K="2L3%' A MKNON'
H' D763'P'O#Q+%;'&9#':Q&9'
2784$,).&
D763'P'O#Q+%;'&9#':Q&9' R'
akquinet business consulting GmbH !60k SE International akquinet IBS GmbH !250k SE akquinet IBS Brüssel GmbH !40k SE akquinet eurosoft Sp. z o.o. !100k SE HKS GmbH !75k SE Microsoft / .NET akquinet dynamic solutions GmbH !300k SE akquinet SLS logistics GmbH !250k SE Outsourcing akquinet
- utsourcing
gGmbH !250k SE akquinet system integration GmbH !125k SE JAVA / SAP akquinet it-agile GmbH !100k SE akquinet tech@spree GmbH !300k SE akquinet enterprise solutions GmbH !80k SE akquinet AG !1300k SE
0+-492:&2,-&0+3$9)&"+94;+,<&
=+5>).),?)&=),.):&@+?4<$,A&+,& ! :+;2"/-'7Q)&#$)' A :+;2"/-3S/8+%'#C=#-8)#' A D763K</)#;' A 7+=93)8*/&#;.'T/-L#')*/"#.'U3)&-3<2&#;')Q)&#$)' ! :+<3"#'7+"28+%)' A !"#$%&#'()*&#
" :+<3"#';#J3*#).'V%&#-/*8+%)'$3;;"#?/-#.'7#-J#-K)3;#'W' " :H:.'OHO'
!>),&B)?/,+9+A$)<& ! D763'X4=/*9#'@#"3C.'4=/*#'4*#.'DGH'!9/$#"#+%.'4=/*9#'7"3%LWY' ! 4%;-+3;' ! 4=/*9#':/J#%' ! E/J/'(('XEOD77.'DGH'ED%47Y'
Z' D763'P'O#Q+%;'&9#':Q&9'
!C):$,A&
D:?/$.)?.4:)E&=+,<49;,AE&B:2$,$,A&2,-&0),.+:$,A&+,& ! 7Q)&#$)'2)3%L'D763'/%;[+-'$+<3"#';#J3*#)' ! :+;2"/-3S/8+%' ! U#J#"+=$#%&'3%I-/)&-2*&2-#.'O23";'=-+*#))' ! \#$+&#'$/%/L#$#%&.'B-+J3)3+%3%L')+"28+%)' F:+G)?.&:)29$H2;+,& ! :/*93%#'&+':/*93%#'/=="3*/8+%)' A \@VU.'U#J3*#'3%&#-/*8+%.'U/&/'*+""#*8+%.'!+%&-+"K"++=' ! :#;3/8+%'['V%&#L-/8+%' A U/&/'=-+*#))3%L'/%;'$#;3/8+%.'M+-3S+%&/"':#;3/8+%'X(7OY' ! :+<3"#'/=="3*/8+%)' A 4%;-+3;' ! U#)0&+='/=="3*/8+%)' A N)#-'#C=#-3#%*#' ! G#<'/=="3*/8+%)'
]' D763'P'O#Q+%;'&9#':Q&9'
!"#$&$,&IJKJ&
D763'P'O#Q+%;'&9#':Q&9' ^'
L!"#$&M+&B/2,7<NE& &+,'&-./# ' '0.$#1,)%($31#%(44&"#5"#6'(11751%# 89#:,$#5$#1&&;1#<=$;.14%&)&#,1&)1# %(8&#$).,:'$%#5$#>?@#AAB.)C1# 4&)D&E$'F#2&''#5"#8GAAA!#%($&#<H-65I#
- 4&"J5"*#G"J#J(F#$)F5"*#K,1$#$.#
,4*)(J&#',E&"&)15."A#!#%($&# H-65L#5$#;(C&1#15;4'&#$%5"*1# E.;4'&MA# =$#'&(1$#1.;&."&#E("#1(F#$%&#C5"*#51# "(C&JA#N%("C1I#O."3$#PQRG#1$.)F# $&(E%#$%.1&#*,F1#("F#'&11."S#<H-65# <D(5'# # #
O5>9)5),.2;+,&02.4:$.*&
- (123%+C.'@#"3C'
- _#?'7=#*3`*/8+%'3%'=-+L-#))'
B++9<&
- V%F#*8+%'@-/$#?+-0'X3BDED.'O"2#=-3%&.'
7!\Y'
- VU('X<%;&++").'BU(Y'
- O23";'&++")'X$/J#%.'/%&WY'
- a#)&)'XF2%3&Z+)L3.'=/CP#C/$Y'
P?9$><)&
- (*"3=)#'VU('
- BH.'\!B'W'
D>>9$?2;+,&"):Q):<&
- 6"/))`)9.'ED%47.'G#<)=9#-#'
- E<+))'4575''
!./):<&
- 7#-J3*#':3C'['@2)#'
- G7DH'X(7O.'V%&#L-/8+%Y'
- 7"3%L''
'
!"#$&"4??)<<&PQ+94;+,&
b' D763'P'O#Q+%;'&9#':Q&9'
a3$#' c3)3<3"3&Q' R5)$%# !$T1#1.#E..'# @:,UUV# !$#1,EC1# @<D(5'V# W.))&E$#,1(*&#("J## :&1$#4)(EXE&1# Y'($&(,#.D#4).J,EX85$F#
D763'P'O#Q+%;'&9#':Q&9' d'
0*&<+RS2:)&$<&3$AA):&./2,&*+4:<&T&
D763'P'O#Q+%;'&9#':Q&9' e'
U2Q2&
- a!fP'DJ#-'g':3""3+%'TD!'
- M/-$+%QP'g5H]':3""3+%'TD!&
VWV&>92*):&&
- */%'*+%&/3%'g':3""3+%'TD!'
D&(01&
- */-'*/%'*+%&/3%'2='&+']h'%#&?+-0#;'
*+$=2&#-3S#;';#J3*#)' P?9$><)&&OVP&
- R5]':3""3+%'TD!'
">2?)&</4X9)&
- 'ih5]':3""3+%'"3%#)&
Y&KJ&9$,)<&2&-2*& Z$3:2:$)<&2:)&2&,)?)<<$.*E&34.&[& &
Z$5$.<&+@&!!F&
D763'P'O#Q+%;'&9#':Q&9' gh'
=+4>9$,A&<)Q):)9*&9$5$.<& :)4<23$9$.*&
! N)3%L'/'L#%#-3*'+<F#*&.'*/%';-/L'3%'/'"/-L#' %2$<#-'+I'+&9#-'+<F#*&)'
=:)2.)<&+Q):9*&92:A)&<*<.)5<& 2R):&2&?):.2$,&?+5>9)\$.*&$<& :)2?/)-& & ]9)\$3$9$.*&54<.&3)&34$9.&$,&3*&./)& >:+A:255):&
! B"2L3%'/-*93&#*&2-#)' ! @/*&+-3#).'U#=#%;#%*Q'V%F#*8+%'
&
&
0+-492:$H)&T&
D763'P'O#Q+%;'&9#':Q&9' gg'
Monolithic Application Modular Application Modular and Dynamic Application Modular and Dynamic Killer Application
U$A<2S&
gH' D763'P'O#Q+%;'&9#':Q&9'
!,?)&4>+,&2&;5)E&./)&5+-492:$.*& & ! E7\'HbbP'E/J/':+;2"#'7Q)&#$' ! E7\'HeZ'P'V$=-+J#;':+;2"/-3&Q'3%'&9#'E/J/'B-+L-/$$3%L'T/%L2/L#' & ! E3L)/?P':+;2"/-3S/8+%'+I'&9#'EUf' A :/Q'+-'$/Q'%+&'<#')&/%;/-;3S#;' A E/J/'7('d'j' A 79+2";'?#'-#/""Q'?/3&.'+-';+'?#'9/J#')+$#&93%L'/"-#/;Q'-+<2)&' #%+2L9'j'
&
1/*&!"#$&6&
D763'P'O#Q+%;'&9#':Q&9' gR'
M))-&<$5>9):&S2*<&.+& ?+,<.:4?.&<+RS2:)& <*<.)5<& &
! D763'3)'/<+2&'<+RS2:)& ?+,<.:4?;+,P'<23";3%L')Q)&#$)' +2&'+I')$/""#-'*+$=+%#%&)'W' ! D763'3)'/<+2&'?+5>+,),.<&./2.& S+:7&.+A)./):'W' ! D763'3)'/<+2&'52,2A$,A&2,-& 4>-2;,A'*+$=+%#%&)'W' ! D763'3)'/<+2&'' kN%3J#-)/"'0$--9)S2:)l'
&
1/*&!"#$&6&
D763'P'O#Q+%;'&9#':Q&9' gZ'
M))-&<$5>9):&S2*<&.+& ?+,<.:4?.&<+RS2:)& <*<.)5<& &
! D763'3)'/<+2&'<+RS2:)& ?+,<.:4?;+,P'<23";3%L')Q)&#$)' +2&'+I')$/""#-'*+$=+%#%&)'W' ! D763'3)'/<+2&'?+5>+,),.<&./2.& S+:7&.+A)./):'W' ! D763'3)'/<+2&'52,2A$,A&2,-& 4>-2;,A'*+$=+%#%&)'W' ! D763'3)'/<+2&'' kN%3J#-)/"'0$--9)S2:)l'
&
D763'P'O#Q+%;'&9#':Q&9' g]'
!"#$&D99$2,?)&
O,-4<.:*&?+,<+:;45& & !"#$&"):Q$?)&F92^+:5&<>)?$_?2;+,& ! @-/$#?+-0')=#*3`*/8+%'I+-'9+)8%L';Q%/$3*/""Q';+?%"+/;/<"#')#-J3*#)' ! 7&/%;/-;')#-J3*#')=#*3`*/8+%)' & ")Q):29&)\>):.&A:+4><&-)_,)&./)&<>)?$_?2;+,<& ! !+-#'B"/m+-$'(C=#-&'6-+2='X!B(6Y' ! :+<3"#'(C=#-&'6-+2='X:(6Y' ! c#93*"#'(C=#-&'6-+2='Xc(6Y' ! (%&#-=-3)#'(C=#-&'6-+2='X((6Y'
g^' D763'P'O#Q+%;'&9#':Q&9'
!"#$&D:?/$.)?.4:29&!Q):Q$)S&
D763'P'O#Q+%;'&9#':Q&9' gb'
!"#$%"#&'
(#)*&#' (#)*&#' (#)*&#'
+,&#"-./'0123&4' 5"*"' +06)' 78.$9&'
!"#$&]:25)S+:7&Z2*):$,A&
D763'P'O#Q+%;'&9#':Q&9' gd'
MODULE LIFECYCLE SERVICE
L1 - Creates the concept of bundles that use classes from each other in a controlled way according to constraints L2 - Manages the lifecycle of bundle in a bundle repository without requiring the VM be restarted L3 – Provides a publish/find/bind service model to decouple bundles
!"#$&]:25)S+:7&`KaIb&
=+5>+,),.c+:$),.)-&@:25)S+:7& ! O2%;"#)'X35#5.'$+;2"#)[*+$=+%#%&)Y' ! B/*0/L#')9/-3%L'/%;'J#-)3+%'$/%/L#$#%&' ! T3I#K*Q*"#'$/%/L#$#%&'/%;'%+8`*/8+%' "):Q$?)c+:$),.)-&2:?/$.)?.4:)&a&?+5>4;,A& ! B2<"3)9[`%;[<3%;'3%&-/Kc:')#-J3*#'$+;#"' !>),&:)5+.)&52,2A)5),.&2:?/$.)?.4:)& ! _+'=-#)*-3<#;'=+"3*Q'+-'=-+&+*+"'
ge' D763'P'O#Q+%;'&9#':Q&9'
!"#$&]:25)S+:7&`IaIb&
d4,<&549;>9)&2>>9$?2;+,<&2,-&<):Q$?)<& "$,A9)&W0&$,<.2,?)& ")>2:2.)&?92<<&9+2-):&>):&34,-9)& ! !"/))'"+/;#-'L-/=9' ! V%;#=#%;#%&'%/$#)=/*#)' ! !"/))')9/-3%L'/&'&9#'E/J/'=/*0/L#'"#J#"' U2Q2&F):5$<<$+,<&.+&<)?4:)&@:25)S+:7& P\>9$?$.9*&?+,<$-):<&-*,25$?&<?),2:$+<& ! \2%K8$#'3%)&/"".'2=;/&#.'/%;'2%3%)&/""'+I'<2%;"#)'
Hh' D763'P'O#Q+%;'&9#':Q&9'
D763'P'O#Q+%;'&9#':Q&9' Hg'
0+-492:$.*&
1/2.6&
HH' D763'P'O#Q+%;'&9#':Q&9'
0+-492:$.*&
1/2.6& ! 7#=/-/8+%'+I'*+%*#-%)' ! 7&-2*&2-#' ! (%*/=)2"/8+%' ! @+*2)#)'+%' A !+9#)3+%'X"+?'3)'</;.'93L9'3)'L++;Y' A !+2="3%L'X"+?'3)'L++;.'93L9'3)'</;Y' 1/*6&
HR' D763'P'O#Q+%;'&9#':Q&9'
0+-492:$.*&
1/2.6& ! 7#=/-/8+%'+I'*+%*#-%)' ! 7&-2*&2-#' ! (%*/=)2"/8+%' ! @+*2)#)'+%' A !+9#)3+%'X"+?'3)'</;.'93L9'3)'L++;Y' A !+2="3%L'X"+?'3)'L++;.'93L9'3)'</;Y' 1/*6& ! V%;#=#%;#%&';#J#"+=$#%&' ! V%;#=#%;#%&'$/3%&#%/%*#'/%;'#J+"28+%' ! V$=-+J#'-#2)/<3"3&Q'
HZ' D763'P'O#Q+%;'&9#':Q&9'
!"#$&(4,-9)&
D&34,-9)&$<&2&5+-49)&$,&!"#$&.):5$,+9+A*& D&34,-9)&$<&2&UDd&_9)&?+,.2$,$,A& ! !+;#' ! \#)+2-*#)' ! :#&/;/&/'
H]' D763'P'O#Q+%;'&9#':Q&9'
Module E'(11#Z'&1# )&1.,)E&#Z'&1# +=0!#
7P-N# A+7#
;&$(J($(#
=+-)&W$<$3$9$.*&0).2-2.2&
D&34,-9)&$<&2&UDd&_9)&?+,.2$,$,A&?+-)& ! G9/&'*+;#'3%'&9#'E4\'`"#'3)'J3)3<"#'&+'+&9#-'*+;#'3%'&9#'E4\'`"#j' ! G9/&'*+;#'3%'&9#'E4\'`"#'3)'J3)3<"#'&+'*+;#'+2&)3;#'&9#'E4\'`"#j' ! G9/&'*+;#'+2&)3;#'&9#'E4\'`"#'3)'J3)3<"#'&+'*+;#'3%)3;#'&9#'E4\'`"#j' e,9$7)&<.2,-2:-&UDd&_9)<E&!"#$&5).2-2.2&)\>9$?$.9*&2,<S):<&299&+@&./)<)& 84)<;+,<&
H^' D763'P'O#Q+%;'&9#':Q&9'
O,.):,29&=+-)&W$<$3$9$.*&
O,.):,29&?+-)&$,&<.2,-2:-&UDd<&?2,&<))&299&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)'
Hb' D763'P'O#Q+%;'&9#':Q&9'
O,.):,29&=+-)&W$<$3$9$.*&
O,.):,29&?+-)&$,&<.2,-2:-&UDd<&?2,&<))&299&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&(4,-9)c=92<<F2./& ! !+$$/K;#"3$3&#;'"3)&'3%;3*/8%L'?9#-#'&+')#/-*9'3%'&9#'E4\'`"#'?9#%'"++03%L' I+-'*"/))#)'
Hd' D763'P'O#Q+%;'&9#':Q&9'
O,.):,29&=+-)&W$<$3$9$.*&
O,.):,29&?+-)&$,&<.2,-2:-&UDd<&?2,&<))&299&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&(4,-9)c=92<<F2./& ! !+$$/K;#"3$3&#;'"3)&'3%;3*/8%L'?9#-#'&+')#/-*9'3%'&9#'E4\'`"#'?9#%'"++03%L' I+-'*"/))#)' B+&A).&<.2,-2:-&UDd&3)/2Q$+:& ! O2%;"#K!"/))B/&9P'5'
He' D763'P'O#Q+%;'&9#':Q&9'
O,.):,29&=+-)&W$<$3$9$.*&
O,.):,29&?+-)&$,&<.2,-2:-&UDd<&?2,&<))&299&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&(4,-9)c=92<<F2./& ! !+$$/K;#"3$3&#;'"3)&'3%;3*/8%L'?9#-#'&+')#/-*9'3%'&9#'E4\'`"#'?9#%'"++03%L' I+-'*"/))#)' B+&A).&<.2,-2:-&UDd&3)/2Q$+:& ! O2%;"#K!"/))B/&9P'5' 02*&29<+&$,?94-)&)53)--)-&UDd<&2,-&-$:)?.+:$)<& P\25>9)<& ! O2%;"#K!"/))B/&9P'"3<[I++5F/-.*"/))#)[' ! O2%;"#K!"/))B/&9P'"3<[I++5F/-.5'
Rh' D763'P'O#Q+%;'&9#':Q&9'
P\>+<$,A&O,.):,29&=+-)&`KaIb&
".2,-2:-&UDd&_9)<&)\>+<)&299&$,.):,29&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)'
Rg' D763'P'O#Q+%;'&9#':Q&9'
P\>+<$,A&O,.):,29&=+-)&`KaIb&
".2,-2:-&UDd&_9)<&)\>+<)&299&$,.):,29&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&P\>+:.cF2?72A)& ! T3)&'+I'=/*0/L#)'I-+$'&9#'<2%;"#'*"/))'=/&9'&+'#C=+)#' ! N)#)'*+$$+%'D763')Q%&/C'$#%8+%#;'#/-"3#-' 1/*&-+&./$<6&
RH' D763'P'O#Q+%;'&9#':Q&9'
P\>+<$,A&O,.):,29&=+-)&`KaIb&
".2,-2:-&UDd&_9)<&)\>+<)&299&$,.):,29&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&P\>+:.cF2?72A)& ! T3)&'+I'=/*0/L#)'I-+$'&9#'<2%;"#'*"/))'=/&9'&+'#C=+)#' ! N)#)'*+$$+%'D763')Q%&/C'$#%8+%#;'#/-"3#-' 1/*&-+&./$<6& ! V&')#=/-/&#)'3%&#-%/"'J3)3<3"3&Q'I-+$'#C&#-%/"'J3)3<3"3&Q' ! V%'+&9#-'?+-;).'3&'/""+?)'<2%;"#)'&+'9/J#'=-3J/&#'*+%&#%&'
RR' D763'P'O#Q+%;'&9#':Q&9'
D??)<<$,A&P\.):,29&=+-)&`KaIb&
".2,-2:-&UDd<&$5>9$?$.9*&<))&)Q):*./$,A&+./):&?92<<&+,&./)&?92<<&>2./& ! _+&'&9#'*/)#'?3&9'<2%;"#)'
RZ' D763'P'O#Q+%;'&9#':Q&9'
D??)<<$,A&P\.):,29&=+-)&`KaIb&
".2,-2:-&UDd<&$5>9$?$.9*&<))&)Q):*./$,A&+./):&?92<<&+,&./)&?92<<&>2./& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&O5>+:.cF2?72A)& ! T3)&'+I'=/*0/L#)'%##;#;'I-+$'+&9#-'<2%;"#)' ! N)#)'*+$$+%'D763')Q%&/C'$#%8+%#;'#/-"3#-'
R]' D763'P'O#Q+%;'&9#':Q&9'
D??)<<$,A&P\.):,29&=+-)&`KaIb&
".2,-2:-&UDd<&$5>9$?$.9*&<))&)Q):*./$,A&+./):&?92<<&+,&./)&?92<<&>2./& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&O5>+:.cF2?72A)& ! T3)&'+I'=/*0/L#)'%##;#;'I-+$'+&9#-'<2%;"#)' ! N)#)'*+$$+%'D763')Q%&/C'$#%8+%#;'#/-"3#-' (4,-9)<&54<.&$5>+:.&)Q):*&,))-)-&>2?72A)&,+.&?+,.2$,)-&$,&./)&34,-9)&$.<)9@E& )\?)>.&G2Q2fg& 1/*&-+&./$<6&
R^' D763'P'O#Q+%;'&9#':Q&9'
D??)<<$,A&P\.):,29&=+-)&`KaIb&
".2,-2:-&UDd<&$5>9$?$.9*&<))&)Q):*./$,A&+./):&?92<<&+,&./)&?92<<&>2./& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&O5>+:.cF2?72A)& ! T3)&'+I'=/*0/L#)'%##;#;'I-+$'+&9#-'<2%;"#)' ! N)#)'*+$$+%'D763')Q%&/C'$#%8+%#;'#/-"3#-' (4,-9)<&54<.&$5>+:.&)Q):*&,))-)-&>2?72A)&,+.&?+,.2$,)-&$,&./)&34,-9)&$.<)9@E& )\?)>.&G2Q2fg& 1/*&-+&./$<6& ! :/0#';#=#%;#%*3#)')\>9$?$.& ! :/0#';#=#%;#%*3#)'52,2A)239)&
Rb' D763'P'O#Q+%;'&9#':Q&9'
O5>+:;,A&h&P\>+:;,A&2&F2?72A)&`Kaib&
O52A$,)&34,-9)&D&<+5)/+S&A).<&<):Q9).&$,<.2,?)<&@:+5&34,-9)&(&
Rd' D763'P'O#Q+%;'&9#':Q&9'
5;4.)$# K(8(MA1&)8'&$[# &M4.)$# K(8(MA1&)8'&$[#
A B
H"&#E.4F#.D# K(8(MA1&)8'&$A-&)8'&$#
O5>+:;,A&h&P\>+:;,A&2&F2?72A)&`Kaib&
1/2.&$@&34,-9)&D&29<+&S2,.)-&.+&A).&<):Q9).&$,<.2,?)<&<+5)/+S&@:+5&34,-9)&=6&
Re' D763'P'O#Q+%;'&9#':Q&9'
5;4.)$# K(8(MA1&)8'&$[# &M4.)$# K(8(MA1&)8'&$[#
A B
H"&#E.4F#.D# K(8(MA1&)8'&$A-&)8'&$#
O5>+:;,A&h&P\>+:;,A&2&F2?72A)&`Iaib&
(4,-9)&=&?+49-&$5>+:.&@:+5&34,-9)&(E&34.&./),&$.&$<&-)>),-),.&+,&$.&
Zh' D763'P'O#Q+%;'&9#':Q&9'
5;4.)$# K(8(MA1&)8'&$[# &M4.)$# K(8(MA1&)8'&$[#
A B
H"&#E.4F#.D# K(8(MA1&)8'&$A-&)8'&$# 5;4.)$# K(8(MA1&)8'&$[#
C
O5>+:;,A&h&P\>+:;,A&2&F2?72A)&`jaib&
(4,-9)&=&?+49-&)\>+:.&$.<&+S,&<):Q9).&>2?72A)E&34.&34,-9)&D&?+49-&+,9*&<))& )$./):&=&+:&(&
Zg' D763'P'O#Q+%;'&9#':Q&9'
&M4.)$# K(8(MA1&)8'&$[#
C
N2.#E.45&1#.D# K(8(MA1&)8'&$A-&)8'&$#
B A
5;4.)$# K(8(MA1&)8'&$[#
:'
&M4.)$# K(8(MA1&)8'&$[#
O5>+:;,A&h&P\>+:;,A&2&F2?72A)&`iaib&
(4,-9)&=&?+49-&$5>+:.E&?+,.2$,&2,-&)\>+:.&<):Q9).&.+&<+9Q)&./)&-$9)552&
ZH' D763'P'O#Q+%;'&9#':Q&9'
PM4.)$#("J#5;4.)$# K(8(MA1&)8'&$[#
C B A
5;4.)$# K(8(MA1&)8'&$[# PM4.)$#("J#5;4.)$# K(8(MA1&)8'&$[#
(4,-9)&02,$@)<.&P\25>9)&
ZR' D763'P'O#Q+%;'&9#':Q&9'
Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Import-Package:
- sgi.service.log; version="[1.0.0,1.1.0)",
- rg.foo.service; version="1.1"
Export-Package:
- rg.foo.service; version="1.1";
vendor="org.foo",
- rg.foo.service.bar; version="1.1";
uses:="org.foo.service"
(4,-9)&02,$@)<.&P\25>9)&
ZZ' D763'P'O#Q+%;'&9#':Q&9'
Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Import-Package:
- sgi.service.log; version="[1.0.0,1.1.0)",
- rg.foo.service; version="1.1"
Export-Package:
- rg.foo.service; version="1.1";
vendor="org.foo",
- rg.foo.service.bar; version="1.1";
uses:="org.foo.service"
Indicates R4 semantics and syntax
(4,-9)&02,$@)<.&P\25>9)&
Z]' D763'P'O#Q+%;'&9#':Q&9'
Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Import-Package:
- sgi.service.log; version="[1.0.0,1.1.0)",
- rg.foo.service; version="1.1"
Export-Package:
- rg.foo.service; version="1.1";
vendor="org.foo",
- rg.foo.service.bar; version="1.1";
uses:="org.foo.service"
Indicates R4 semantics and syntax
Globally unique ID
(4,-9)&02,$@)<.&P\25>9)&
Z^' D763'P'O#Q+%;'&9#':Q&9'
Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Import-Package:
- sgi.service.log; version="[1.0.0,1.1.0)",
- rg.foo.service; version="1.1"
Export-Package:
- rg.foo.service; version="1.1";
vendor="org.foo",
- rg.foo.service.bar; version="1.1";
uses:="org.foo.service"
Internal bundle class path
(4,-9)&02,$@)<.&P\25>9)&
Zb' D763'P'O#Q+%;'&9#':Q&9'
Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Import-Package:
- sgi.service.log; version="[1.0.0,1.1.0)",
- rg.foo.service; version="1.1"
Export-Package:
- rg.foo.service; version="1.1";
vendor="org.foo",
- rg.foo.service.bar; version="1.1";
uses:="org.foo.service"
Import of a package version range
(4,-9)&02,$@)<.&P\25>9)&
Zd' D763'P'O#Q+%;'&9#':Q&9'
Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Import-Package:
- sgi.service.log; version="[1.0.0,1.1.0)",
- rg.foo.service; version="1.1"
Export-Package:
- rg.foo.service; version="1.1";
vendor="org.foo",
- rg.foo.service.bar; version="1.1";
uses:="org.foo.service"
Importing an exported package
(4,-9)&02,$@)<.&P\25>9)&
Ze' D763'P'O#Q+%;'&9#':Q&9'
Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Import-Package:
- sgi.service.log; version="[1.0.0,1.1.0)",
- rg.foo.service; version="1.1"
Export-Package:
- rg.foo.service; version="1.1";
vendor="org.foo",
- rg.foo.service.bar; version="1.1";
uses:="org.foo.service"
Exported package with version and arbitrary attribute
(4,-9)&02,$@)<.&P\25>9)&
]h' D763'P'O#Q+%;'&9#':Q&9'
Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Import-Package:
- sgi.service.log; version="[1.0.0,1.1.0)",
- rg.foo.service; version="1.1"
Export-Package:
- rg.foo.service; version="1.1";
vendor="org.foo",
- rg.foo.service.bar; version="1.1";
uses:="org.foo.service"
Provided package with dependency on exported package
!"#$&V)>),-),?*&0+-)9&
F2?72A)c9)Q)9&Q<&5+-49)c9)Q)9&-)>),-),?$)<& ! G9+'J)'?9/&'
]g' D763'P'O#Q+%;'&9#':Q&9'
!"#$&V)>),-),?*&0+-)9&
F2?72A)c9)Q)9&Q<&5+-49)c9)Q)9&-)>),-),?$)<& ! G9+'J)'?9/&' 0+-49)c9)Q)9&-)>),-),?$)<& ! !+/-)#'L-/3%#;' ! 4-#'<-3n"#' ! M3;#'&9#'&-2#';#=#%;#%*3#)'
]H' D763'P'O#Q+%;'&9#':Q&9'
!"#$&V)>),-),?*&0+-)9&
F2?72A)c9)Q)9&Q<&5+-49)c9)Q)9&-)>),-),?$)<& ! G9+'J)'?9/&' 0+-49)c9)Q)9&-)>),-),?$)<& ! !+/-)#'L-/3%#;' ! 4-#'<-3n"#' ! M3;#'&9#'&-2#';#=#%;#%*3#)' F2?72A)c9)Q)9&-)>),-),?$)<& ! @3%#'L-/3%#;' ! @"#C3<"#.'#%/<"#'-#I/*&+-3%L' ! 4-#'&9#'&-2#';#=#%;#%*3#)'X35#5.'&9#Qo-#'3%'&9#'*+;#Y'
]R' D763'P'O#Q+%;'&9#':Q&9'
!"#$&V)>),-),?*&0+-)9&
F2?72A)c9)Q)9&Q<&5+-49)c9)Q)9&-)>),-),?$)<& ! G9+'J)'?9/&' 0+-49)c9)Q)9&-)>),-),?$)<& ! !+/-)#'L-/3%#;' ! 4-#'<-3n"#' ! M3;#'&9#'&-2#';#=#%;#%*3#)' F2?72A)c9)Q)9&-)>),-),?$)<& ! @3%#'L-/3%#;' ! @"#C3<"#.'#%/<"#'-#I/*&+-3%L' ! 4-#'&9#'&-2#';#=#%;#%*3#)'X35#5.'&9#Qo-#'3%'&9#'*+;#Y' F2?72A)c9)Q)9&-)>),-),?$)<&:)84$:)&>2?72A)<&.+&3)&2.+5$?&`$f)fE&$,&2&<$,A9)& 34,-9)b&
]Z' D763'P'O#Q+%;'&9#':Q&9'
V)>),-),?*&d)<+94;+,&`KaIb&
D4.+52;?299*&52,2A)-&3*&./)&!"#$&@:25)S+:7& ! (%)2-#)'/'<2%;"#o)';#=#%;#%*3#)'/-#')/8)`#;'<#I+-#'&9#'<2%;"#'*/%'<#'2)#;'
]]' D763'P'O#Q+%;'&9#':Q&9'
V)>),-),?*&d)<+94;+,&`KaIb&
D4.+52;?299*&52,2A)-&3*&./)&!"#$&@:25)S+:7& ! (%)2-#)'/'<2%;"#o)';#=#%;#%*3#)'/-#')/8)`#;'<#I+-#'&9#'<2%;"#'*/%'<#'2)#;' O,&<$5>9)&.):5<E&:)<+9Q$,A&2&34,-9)&52.?/)<&$.<&$5>+:.)-&>2?72A)<&.+&34,-9)<& >:+Q$-$,A&./)5& & & &
]^' D763'P'O#Q+%;'&9#':Q&9'
A B C
5;4.)$# K(8(MA1&)8'&$A%\4# &M4.)$# K(8(MA1&)8'&$A%\4# 5;4.)$# K(8(MA1&)8'&$# &M4.)$# K(8(MA1&)8'&$#
V)>),-),?*&d)<+94;+,&`KaIb&
D4.+52;?299*&52,2A)-&3*&./)&!"#$&@:25)S+:7& ! (%)2-#)'/'<2%;"#o)';#=#%;#%*3#)'/-#')/8)`#;'<#I+-#'&9#'<2%;"#'*/%'<#'2)#;' O,&<$5>9)&.):5<E&:)<+9Q$,A&2&34,-9)&52.?/)<&$.<&$5>+:.)-&>2?72A)<&.+&34,-9)<& >:+Q$-$,A&./)5& & & & & & ! aQ=3*/""Q.'-#)+"J3%L'/'<2%;"#'?3""'-#)2"&'3%'+&9#-'<2%;"#)'<#3%L'&-/%)38J#"Q'
- #)+"J#;'
]b' D763'P'O#Q+%;'&9#':Q&9'
A B C
5;4.)$# K(8(MA1&)8'&$A%\4# &M4.)$# K(8(MA1&)8'&$A%\4# 5;4.)$# K(8(MA1&)8'&$# &M4.)$# K(8(MA1&)8'&$#
V)>),-),?*&d)<+94;+,&`KaIb&
D4.+52;?299*&52,2A)-&3*&./)&!"#$&@:25)S+:7& ! (%)2-#)'/'<2%;"#o)';#=#%;#%*3#)'/-#')/8)`#;'<#I+-#'&9#'<2%;"#'*/%'<#'2)#;' O,&<$5>9)&.):5<E&:)<+9Q$,A&2&34,-9)&52.?/)<&$.<&$5>+:.)-&>2?72A)<&.+&34,-9)<& >:+Q$-$,A&./)5& & & & & ! aQ=3*/""Q.'-#)+"J3%L'/'<2%;"#'?3""'-#)2"&'3%'+&9#-'<2%;"#)'<#3%L'&-/%)38J#"Q'
- #)+"J#;'
! VI'/'J#-)3+%'+-'/-<3&-/-Q'/n-3<2&#)'/-#')=#*3`#;'+%'3$=+-&).'&9#%'#C=+-&)'$2)&' $/&*9' A :2"8="#'/n-3<2&#)'+%'/%'3$=+-&'/-#'"+L3*/""Q'DMV)-&
]d' D763'P'O#Q+%;'&9#':Q&9'
A B C
5;4.)$# K(8(MA1&)8'&$A%\4# &M4.)$# K(8(MA1&)8'&$A%\4# 5;4.)$# K(8(MA1&)8'&$# &M4.)$# K(8(MA1&)8'&$#
V)>),-),?*&d)<+94;+,&`IaIb&
049;>9)&52.?/$,A&>:+Q$-):<& & & & & & & &
]e' D763'P'O#Q+%;'&9#':Q&9'
5;4.)$# K(8(MA1&)8'&$[# 8&)15."]^GA_A`^# &M4.)$# K(8(MA1&)8'&$[# 8&)15."]^GAaA`^# &M4.)$# K(8(MA1&)8'&$[# 8&)15."]^GA_A`^#
:'
C A B
V)>),-),?*&d)<+94;+,&`IaIb&
049;>9)&52.?/$,A&>:+Q$-):<& & & & & & & & ! \#)+"28+%'/"L+-3&9$'+-;#-)'$/&*93%L'=-+J3;#-)' A 4"-#/;Q'-#)+"J#;'=-+J3;#-)'+-;#-#;'<Q';#*-#/)3%L'J#-)3+%' A N%-#)+"J#;'=-+J3;#-)'+-;#-#;'<Q';#*-#/)3%L'J#-)3+%' A VI'J#-)3+%)'/-#'#12/".'$/&*93%L'=-+J3;#-)'/-#'+-;#-#;'</)#;'+%'3%)&/""/8+%'+-;#-'
^h' D763'P'O#Q+%;'&9#':Q&9'
5;4.)$# K(8(MA1&)8'&$[# 8&)15."]^GA_A`^# &M4.)$# K(8(MA1&)8'&$[# 8&)15."]^GAaA`^# &M4.)$# K(8(MA1&)8'&$[# 8&)15."]^GA_A`^#
:'
C A B
M+,c0+-492:&F2$,.&F:+A:25&`Kajb&
1)&/2Q)&2&<$5>9)&>2$,.&>:+A:25&
^g' D763'P'O#Q+%;'&9#':Q&9'
7).;#$%&#H-65#5"#=EX."# :..C#
M+,c0+-492:&F2$,.&F:+A:25&`Iajb&
O.&$<&>2?72A)-&2<&2&<$,A9)&UDd&_9)&S$./&./)&@+99+S$,A&?+,.),.<'&
^H' D763'P'O#Q+%;'&9#':Q&9'
META-INF/ META-INF/MANIFEST.MF
- rg/
- rg/foo/
- rg/foo/paint/
- rg/foo/paint/PaintFrame$1$1.class
- rg/foo/paint/PaintFrame$1.class
- rg/foo/paint/PaintFrame$ShapeActionListener.class
- rg/foo/paint/PaintFrame.class
- rg/foo/paint/SimpleShape.class
- rg/foo/paint/ShapeComponent.class
- rg/foo/shape/
- rg/foo/shape/Circle.class
- rg/foo/shape/circle.png
- rg/foo/shape/Square.class
- rg/foo/shape/square.png
- rg/foo/shape/Triangle.class
- rg/foo/shape/triangle.png
M+,c0+-492:&F2$,.&F:+A:25&`Iajb&
O.&$<&>2?72A)-&2<&2&<$,A9)&UDd&_9)&S$./&./)&@+99+S$,A&?+,.),.<'&
^R' D763'P'O#Q+%;'&9#':Q&9'
META-INF/ META-INF/MANIFEST.MF
- rg/
- rg/foo/
- rg/foo/paint/
- rg/foo/paint/PaintFrame$1$1.class
- rg/foo/paint/PaintFrame$1.class
- rg/foo/paint/PaintFrame$ShapeActionListener.class
- rg/foo/paint/PaintFrame.class
- rg/foo/paint/SimpleShape.class
- rg/foo/paint/ShapeComponent.class
- rg/foo/shape/
- rg/foo/shape/Circle.class
- rg/foo/shape/circle.png
- rg/foo/shape/Square.class
- rg/foo/shape/square.png
- rg/foo/shape/Triangle.class
- rg/foo/shape/triangle.png
Main implementation package is
- rg.foo.paint
M+,c0+-492:&F2$,.&F:+A:25&`Iajb&
O.&$<&>2?72A)-&2<&2&<$,A9)&UDd&_9)&S$./&./)&@+99+S$,A&?+,.),.<'&
^Z' D763'P'O#Q+%;'&9#':Q&9'
META-INF/ META-INF/MANIFEST.MF
- rg/
- rg/foo/
- rg/foo/paint/
- rg/foo/paint/PaintFrame$1$1.class
- rg/foo/paint/PaintFrame$1.class
- rg/foo/paint/PaintFrame$ShapeActionListener.class
- rg/foo/paint/PaintFrame.class
- rg/foo/paint/SimpleShape.class
- rg/foo/paint/ShapeComponent.class
- rg/foo/shape/
- rg/foo/shape/Circle.class
- rg/foo/shape/circle.png
- rg/foo/shape/Square.class
- rg/foo/shape/square.png
- rg/foo/shape/Triangle.class
- rg/foo/shape/triangle.png
Static main method in PaintFrame
M+,c0+-492:&F2$,.&F:+A:25&`Iajb&
O.&$<&>2?72A)-&2<&2&<$,A9)&UDd&_9)&S$./&./)&@+99+S$,A&?+,.),.<'&
^]' D763'P'O#Q+%;'&9#':Q&9'
META-INF/ META-INF/MANIFEST.MF
- rg/
- rg/foo/
- rg/foo/paint/
- rg/foo/paint/PaintFrame$1$1.class
- rg/foo/paint/PaintFrame$1.class
- rg/foo/paint/PaintFrame$ShapeActionListener.class
- rg/foo/paint/PaintFrame.class
- rg/foo/paint/SimpleShape.class
- rg/foo/paint/ShapeComponent.class
- rg/foo/shape/
- rg/foo/shape/Circle.class
- rg/foo/shape/circle.png
- rg/foo/shape/Square.class
- rg/foo/shape/square.png
- rg/foo/shape/Triangle.class
- rg/foo/shape/triangle.png
Interface SimpleShape supports multiple shape implementations
M+,c0+-492:&F2$,.&F:+A:25&`Iajb&
O.&$<&>2?72A)-&2<&2&<$,A9)&UDd&_9)&S$./&./)&@+99+S$,A&?+,.),.<'&
^^' D763'P'O#Q+%;'&9#':Q&9'
META-INF/ META-INF/MANIFEST.MF
- rg/
- rg/foo/
- rg/foo/paint/
- rg/foo/paint/PaintFrame$1$1.class
- rg/foo/paint/PaintFrame$1.class
- rg/foo/paint/PaintFrame$ShapeActionListener.class
- rg/foo/paint/PaintFrame.class
- rg/foo/paint/SimpleShape.class
- rg/foo/paint/ShapeComponent.class
- rg/foo/shape/
- rg/foo/shape/Circle.class
- rg/foo/shape/circle.png
- rg/foo/shape/Square.class
- rg/foo/shape/square.png
- rg/foo/shape/Triangle.class
- rg/foo/shape/triangle.png
Shape implementations defined in org.foo.shape
M+,c0+-492:&F2$,.&F:+A:25&`jajb&
d)92;+,</$>&25+,A&?92<<)<&
^b' D763'P'O#Q+%;'&9#':Q&9'
Paint Frame Simple Shape Shape Component Circle Square Triangle b# c# b# c#
M+,c0+-492:&F2$,.&F:+A:25&`jajb&
d)92;+,</$>&25+,A&?92<<)<&
^d' D763'P'O#Q+%;'&9#':Q&9'
Paint Frame Simple Shape Shape Component Circle Square Triangle b# c# b# c# How to decompose into bundles?
0+-492:&F2$,.&F:+A:25&V)<$A,&
^e' D763'P'O#Q+%;'&9#':Q&9'
Shape Paint
Square
&M4.)$# .)*AD..A1%(4&A1d,()&# &M4.)$# .)*AD..A1%(4&#
Triangle
&M4.)$# .)*AD..A1%(4&A$)5("*'&#
Circle
&M4.)$# .)*AD..A1%(4&AE5)E'&#
(),)_.<&+@&0+-492:$H)-&F2$,.&F:+A:25&
P,@+:?)-&9+A$?29&3+4,-2:$)<& & D4.+52;?&-)>),-),?*&:)<+94;+,& ! (%)2-#)'=-+=#-'*+%`L2-/8+%' ' O5>:+Q)<&:)4<23$9$.*&+@&?+-)& & O5>:+Q)<&23$9$.*&.+&?:)2.)&-$C):),.&?+,_A4:2;+,<&
bh' D763'P'O#Q+%;'&9#':Q&9'
D763'P'O#Q+%;'&9#':Q&9' bg'
1/2.&h&1/*&+@&Z$@)?*?9)&Z2*):&
!,?)&S)&/2Q)&2&34,-9)E&S/2.&-+&S)&-+&S$./&$.6& ! G#'%##;'&+')+$#9+?'&#""'&9#'D763'I-/$#?+-0'/<+2&'3&'
bH' D763'P'O#Q+%;'&9#':Q&9'
1/2.&h&1/*&+@&Z$@)?*?9)&Z2*):&
!,?)&S)&/2Q)&2&34,-9)E&S/2.&-+&S)&-+&S$./&$.6& ! G#'%##;'&+')+$#9+?'&#""'&9#'D763'I-/$#?+-0'/<+2&'3&' 1/2.&$@&+4:&34,-9)&,))-<&.+&3)&$,$;29$H)-&<+5)/+S6& ! G#'%##;')+$#')+-&'+I'9++0'3%'&9#'I-/$#?+-0'
bR' D763'P'O#Q+%;'&9#':Q&9'
1/2.&h&1/*&+@&Z$@)?*?9)&Z2*):&
!,?)&S)&/2Q)&2&34,-9)E&S/2.&-+&S)&-+&S$./&$.6& ! G#'%##;'&+')+$#9+?'&#""'&9#'D763'I-/$#?+-0'/<+2&'3&' 1/2.&$@&+4:&34,-9)&,))-<&.+&3)&$,$;29$H)-&<+5)/+S6& ! G#'%##;')+$#')+-&'+I'9++0'3%'&9#'I-/$#?+-0' 1/2.&$@&S)&S2,.&.+&2--&2,-&:)5+Q)&34,-9)<&2.&:4,&;5)6& ! G#'%##;')+$#?/Q'&+'/**#))'&9#'2%;#-"Q3%L'I-/$#?+-0'
bZ' D763'P'O#Q+%;'&9#':Q&9'
1/2.&h&1/*&+@&Z$@)?*?9)&Z2*):&
!,?)&S)&/2Q)&2&34,-9)E&S/2.&-+&S)&-+&S$./&$.6& ! G#'%##;'&+')+$#9+?'&#""'&9#'D763'I-/$#?+-0'/<+2&'3&' 1/2.&$@&+4:&34,-9)&,))-<&.+&3)&$,$;29$H)-&<+5)/+S6& ! G#'%##;')+$#')+-&'+I'9++0'3%'&9#'I-/$#?+-0' 1/2.&$@&S)&S2,.&.+&2--&2,-&:)5+Q)&34,-9)<&2.&:4,&;5)6& ! G#'%##;')+$#?/Q'&+'/**#))'&9#'2%;#-"Q3%L'I-/$#?+-0' 1)&?2,&-+&299&+@&./)<)&./$,A<&S$./&2&S)99c-)_,)-&9$@)?*?9)&@+:&34,-9)<& ! 4'"3I#*Q*"#';#`%#)'&9#')&/L#)'+I'/'<2%;"#o)'"3I#8$#' A a9#'I-/$#?+-0'/))+*3/&#)'/'"3I#*Q*"#')&/&#'?3&9'#/*9'<2%;"#'
b]' D763'P'O#Q+%;'&9#':Q&9'
(4,-9)&Z$@)&=*?9)&
b^' D763'P'O#Q+%;'&9#':Q&9'
INSTALLED RESOLVED UNINSTALLED STARTING STOPPING ACTIVE &M4'5E5$# (,$.;(XE# 5"1$(''# ,4J($&# ,"5"1$(''# )&1.'8&# ,"5"1$(''# 1$()$# 1$.4#
(4,-9)&Z$@)&=*?9)&
bb' D763'P'O#Q+%;'&9#':Q&9'
UNINSTALLED STARTING STOPPING ACTIVE &M4'5E5$# (,$.;(XE# ,4J($&# ,"5"1$(''# ,"5"1$(''# 1$()$# 1$.4# INSTALLED 5"1$(''# )&1.'8&# RESOLVED
;&2<9*)./'"'=8.$9&>'#&2<9*&2')32' ?<$&'$&,&.$&.?)&2'
(4,-9)&Z$@)&=*?9)&
bd' D763'P'O#Q+%;'&9#':Q&9'
)&1.'8&# INSTALLED 5"1$(''# UNINSTALLED &M4'5E5$# (,$.;(XE# ,4J($&# ,"5"1$(''# ,"5"1$(''# 1$()$# RESOLVED STOPPING STARTING 1$.4# ACTIVE
@?-*"-./'"'=8.$9&>',#<*)$&2'".' <,,<#38.)31'3<').)-"9)A&'".$' "??&22'3B&'C#"4&%<#D'
(4,-9)&D?;Q2.+:&
B/)&34,-9)&2?;Q2.+:&$<&2&@:25)S+:7&/++7&.+&299+S&34,-9)<&.+&<.2:.4>&2,-& </4.-+S,&
be' D763'P'O#Q+%;'&9#':Q&9'
(4,-9)&D?;Q2.+:&
B/)&34,-9)&2?;Q2.+:&$<&2&@:25)S+:7&/++7&.+&299+S&34,-9)<&.+&<.2:.4>&2,-& </4.-+S,& ! a9#'9++0'3)'3%J+0#;'3%'&9#'7a4\aV_6[7aDBBV_6')&/&#)'
dh' D763'P'O#Q+%;'&9#':Q&9'
(4,-9)&D?;Q2.+:&
B/)&34,-9)&2?;Q2.+:&$<&2&@:25)S+:7&/++7&.+&299+S&34,-9)<&.+&<.2:.4>&2,-& </4.-+S,& ! a9#'9++0'3)'3%J+0#;'3%'&9#'7a4\aV_6[7aDBBV_6')&/&#)' ! 4%'/*8J/&+-'3$="#$#%&)'/')3$="#'3%&#-I/*#'/%;'3)'3%*"2;#;'3%'&9#'<2%;"#'E4\' `"#' &
dg' D763'P'O#Q+%;'&9#':Q&9'
public interface BundleActivator { void start(BundleContext context) throws Exception; void stop(BundleContext context) throws Exception; }
(4,-9)&D?;Q2.+:&
B/)&34,-9)&2?;Q2.+:&$<&2&@:25)S+:7&/++7&.+&299+S&34,-9)<&.+&<.2:.4>&2,-& </4.-+S,& ! a9#'9++0'3)'3%J+0#;'3%'&9#'7a4\aV_6[7aDBBV_6')&/&#)' ! 4%'/*8J/&+-'3$="#$#%&)'/')3$="#'3%&#-I/*#'/%;'3)'3%*"2;#;'3%'&9#'<2%;"#'E4\' `"#' & & & ! 4;;38+%/"'$/%3I#)&'$#&/;/&/'3)'%##;#;'&+';#*"/-#'&9#'/*8J/&+-'
dH' D763'P'O#Q+%;'&9#':Q&9'
public interface BundleActivator { void start(BundleContext context) throws Exception; void stop(BundleContext context) throws Exception; } Bundle-Activator: <fully-qualified-class-name> &A*A># Bundle-Activator: org.foo.MyActivator
(4,-9)&D?;Q2.+:&
B/)&34,-9)&2?;Q2.+:&$<&2&@:25)S+:7&/++7&.+&299+S&34,-9)<&.+&<.2:.4>&2,-& </4.-+S,& ! a9#'9++0'3)'3%J+0#;'3%'&9#'7a4\aV_6[7aDBBV_6')&/&#)' ! 4%'/*8J/&+-'3$="#$#%&)'/')3$="#'3%&#-I/*#'/%;'3)'3%*"2;#;'3%'&9#'<2%;"#'E4\' `"#' & & & ! 4;;38+%/"'$/%3I#)&'$#&/;/&/'3)'%##;#;'&+';#*"/-#'&9#'/*8J/&+-'
dR' D763'P'O#Q+%;'&9#':Q&9'
public interface BundleActivator { void start(BundleContext context) throws Exception; void stop(BundleContext context) throws Exception; } Bundle-Activator: <fully-qualified-class-name> &A*A># Bundle-Activator: org.foo.MyActivator What are these?
(4,-9)&=+,.)\.&
d)>:)<),.<&./)&34,-9)k<&)\)?4;+,&?+,.)\.&
dZ' D763'P'O#Q+%;'&9#':Q&9'
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); Bundle[] getBundles(); ... void addBundleListener(BundleListener listener); void removeBundleListener(BundleListener listener); void addFrameworkListener(FrameworkListener listener); void removeFrameworkListener(FrameworkListener listener); ... File getDataFile(String filename); ... }
(4,-9)&=+,.)\.&
d)>:)<),.<&./)&34,-9)k<&)\)?4;+,&?+,.)\.&
d]' D763'P'O#Q+%;'&9#':Q&9'
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); Bundle[] getBundles(); ... void addBundleListener(BundleListener listener); void removeBundleListener(BundleListener listener); void addFrameworkListener(FrameworkListener listener); void removeFrameworkListener(FrameworkListener listener); ... File getDataFile(String filename); ... }
Lifecycle method to install other bundles
(4,-9)&=+,.)\.&
d)>:)<),.<&./)&34,-9)k<&)\)?4;+,&?+,.)\.&
d^' D763'P'O#Q+%;'&9#':Q&9'
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); Bundle[] getBundles(); ... void addBundleListener(BundleListener listener); void removeBundleListener(BundleListener listener); void addFrameworkListener(FrameworkListener listener); void removeFrameworkListener(FrameworkListener listener); ... File getDataFile(String filename); ... }
Access to other installed bundles
(4,-9)&=+,.)\.&
d)>:)<),.<&./)&34,-9)k<&)\)?4;+,&?+,.)\.&
db' D763'P'O#Q+%;'&9#':Q&9'
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); Bundle[] getBundles(); ... void addBundleListener(BundleListener listener); void removeBundleListener(BundleListener listener); void addFrameworkListener(FrameworkListener listener); void removeFrameworkListener(FrameworkListener listener); ... File getDataFile(String filename); ... }
Access to our own bundle... what's that?
(4,-9)&
d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)&
dd' D763'P'O#Q+%;'&9#':Q&9'
public 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 ClassNotFoundException; ... BundleContext getBundleContext(); }
(4,-9)&
d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)&
de' D763'P'O#Q+%;'&9#':Q&9'
public 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 ClassNotFoundException; ... BundleContext getBundleContext(); }
Lifecycle method to start bundle
(4,-9)&
d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)&
eh' D763'P'O#Q+%;'&9#':Q&9'
public 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 ClassNotFoundException; ... BundleContext getBundleContext(); }
Lifecycle method to stop bundle
(4,-9)&
d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)&
eg' D763'P'O#Q+%;'&9#':Q&9'
public 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 ClassNotFoundException; ... BundleContext getBundleContext(); }
Lifecycle method to update bundle
(4,-9)&
d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)&
eH' D763'P'O#Q+%;'&9#':Q&9'
public 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 ClassNotFoundException; ... BundleContext getBundleContext(); }
Lifecycle method to uninstall bundle
(4,-9)&
d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)&
eR' D763'P'O#Q+%;'&9#':Q&9'
public 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 ClassNotFoundException; ... BundleContext getBundleContext(); }
Access to bundle resources
(4,-9)&
d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)&
eZ' D763'P'O#Q+%;'&9#':Q&9'
public 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 ClassNotFoundException; ... BundleContext getBundleContext(); }
Access to accessible classes
(4,-9)&V*,25$<5&
(4,-9)<&?2,&3)&$,<.299)-E&<.2:.)-E&<.+>>)-E&4>-2.)-E&2,-&4,$,<.299)-&2.&:4,&;5)& ! O2%;"#'#J#%&)')3L%/"'"3I#*Q*"#'*9/%L#)'
e]' D763'P'O#Q+%;'&9#':Q&9'
N.#'51$&"#D.)#&8&"$1# BundleContext.addBundleListener()
(4,-9)&V*,25$<5&
(4,-9)<&?2,&3)&$,<.299)-E&<.2:.)-E&<.+>>)-E&4>-2.)-E&2,-&4,$,<.299)-&2.&:4,&;5)& ! O2%;"#'#J#%&)')3L%/"'"3I#*Q*"#'*9/%L#)'
e^' D763'P'O#Q+%;'&9#':Q&9'
!;4'&;&"$#'51$&"&)#5"$&)D(E&# public interface BundleListener extends EventListener { public void bundleChanged(BundleEvent event); }
(4,-9)&V*,25$<5&
(4,-9)<&?2,&3)&$,<.299)-E&<.2:.)-E&<.+>>)-E&4>-2.)-E&2,-&4,$,<.299)-&2.&:4,&;5)& ! O2%;"#'#J#%&)')3L%/"'"3I#*Q*"#'*9/%L#)'
eb' D763'P'O#Q+%;'&9#':Q&9'
e&E&58&J#&8&"$# public class BundleEvent extends EventObject { public final static int INSTALLED = 0x00000001; 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() { … } }
(4,-9)c(2<)-&V*,25$?&P\.),<$3$9$.*&
(4,-9)&9$@)?*?9)&)Q),.<&>:+Q$-)&2&5)?/2,$<5&@+:&-*,25$?&)\.),<$3$9$.*& B/)&)\.),-):&>2X):,& ! 4%'/=="3*/8+%'*+$=+%#%&.'*/""#;'&9#'#C&#%;#-.'"3)&#%)'I+-'<2%;"#)'&+'<#' 3%)&/""#;.')&/-&#;.'/%;')&+==#;' ! D%'3%)&/"".'&9#'#C&#%;#-'=-+<#)'<2%;"#)'&+')##'3I'&9#Q'/-#'#C&#%)3+%)' A aQ=3*/""Q.'#C&#%)3+%'*+%&/3%')=#*3/"'$#&/;/&/'+-'-#)+2-*#)'&+'3%;3*/&#'&9#Q' =-+J3;#'/%'#C&#%)3+%' ! G9#%')&/-&#;.'&9#'#C&#%;#-'=#-I+-$)')+$#'/*8+%'&+'3%&#L-/&#'&9#'#C&#%)3+%' 3%&+'&9#'/=="3*/8+%' ! G9#%')&+==#;.'&9#'#C&#%;#-'=#-I+-$)')+$#'/*8+%'&+'-#$+J#'&9#'#C&#%)3+%' I-+$'&9#'/=="3*/8+%'
ed' D763'P'O#Q+%;'&9#':Q&9'
P\.),-):&F2X):,&
D763'P'O#Q+%;'&9#':Q&9' ee'
W.)&# Tracker Frame Installed bundles
P\.),-):&F2X):,&
D763'P'O#Q+%;'&9#':Q&9' ghh'
e&*51$&)# :,"J'&#'51$&"&)# Installed bundles W.)&# Tracker Frame
P\.),-):&F2X):,&
D763'P'O#Q+%;'&9#':Q&9' ghg'
!"1$(''# :,"J'&AK()# Installed bundles W.)&# Tracker Frame
P\.),-):&F2X):,&
D763'P'O#Q+%;'&9#':Q&9' ghH'
- %(4&#
5;4'# W)&($&# '.*5E('#:,"J'&# Installed bundles W.)&# Tracker Frame
P\.),-):&F2X):,&
D763'P'O#Q+%;'&9#':Q&9' ghR'
- %(4&#
5;4'#
- $()X"*#1%(4&#
:,"J'&#)&1.'8&1#5$# Installed bundles W.)&# Tracker Frame
P\.),-):&F2X):,&
D763'P'O#Q+%;'&9#':Q&9' ghZ'
- %(4&#
5;4'# R,"J'&# 1$()$#&8&"$# Installed bundles W.)&# Tracker Frame
P\.),-):&F2X):,&
D763'P'O#Q+%;'&9#':Q&9' gh]'
- %(4&#
5;4'# !"$&)).*($&#D.)#;&$(J($(L# )&1.,)E&1L#E'(11&1L#&$EA# Installed bundles W.)&# Tracker Frame
P\.),-):&F2X):,&
D763'P'O#Q+%;'&9#':Q&9' gh^'
- %(4&#
5;4'# Installed bundles W.)&# Tracker Frame ).E&?3'
P\.),-):&F2X):,&
D763'P'O#Q+%;'&9#':Q&9' ghb'
- %(4&#
5;4'#
7.)#$%&#)&8&)1&L#5D#$%%(4&#:,"J'&# 51#1$.44&JL#$%&#$)(EC&)#)&;.8&1#5$1# (11.E5($&J#1%(4&A#
Installed bundles W.)&# Tracker Frame
P\.),-):&F2$,.&F:+A:25&!Q):Q$)S&`KaIb&
V*,25$?299*&)\.),<$39)&>2$,.&>:+A:25&& ! N)#)'&9#'#C&#%;#-'=/n#-%'&+';#"3J#-')9/=#)' ! a9#'=/3%&'<2%;"#'3)'&9#'#C&#%;#-.'35#5.'3&'"3)&#%)'I+-'<2%;"#)'*+%&/3%3%L')9/=#)' ! D%'3%)&/"".'&9#'#C&#%;#-'=-+<#)'<2%;"#)'&+')##'3I'&9#Q'/-#'#C&#%)3+%)' A 7=#*3/"'$#&/;/&/'3%'&9#'$/%3I#)&';#%+&#)'&9#'%/$#.'*"/)).'/%;'3*+%'+I'&9#' )9/=#' e<)<&>92?)/+9-):&S/),&</2>)&/2<&3)),&4<)-E&34.&?4::),.9*&4,2Q2$9239)&3)?24<)& ./)&34,-9)&$<&,+.&2?;Q)&
ghd' D763'P'O#Q+%;'&9#':Q&9'
P\.),-):&F2$,.&F:+A:25&V)<$A,&`KaIb&
ghe' D763'P'O#Q+%;'&9#':Q&9'
Paint Frame Simple Shape Shape Component Circle Square Triangle b# c# b# c# Shape Extension Tracker Default Shape
P\.),-):&F2$,.&F:+A:25&V)<$A,&`IaIb&
ggh' D763'P'O#Q+%;'&9#':Q&9'
Shape Paint Square
&M4.)$# .)*AD..A1%(4&#
Triangle Circle
Extension-Name: Extension-Name: Circle Circle Extension-Class: Extension-Class:
- rg.foo.shape.circle.Circle
- rg.foo.shape.circle.Circle
Extension-Icon: Extension-Icon:
- rg/
- rg/foo/shape/circle/circle.png
foo/shape/circle/circle.png
d)@:)</$,A&./)&]:25)S+:7&
e>-2.)&2,-&4,$,<.299&9$@)?*?9)&+>):2;+,<&2:)&2&9$X9)&?+5>9$?2.)-& ! G9Qj'
ggg' D763'P'O#Q+%;'&9#':Q&9'
d)@:)</$,A&./)&]:25)S+:7&
e>-2.)&2,-&4,$,<.299&9$@)?*?9)&+>):2;+,<&2:)&2&9$X9)&?+5>9$?2.)-& ! G9Qj' A (C3)8%L'<2%;"#'$/Q<#'<#'2)3%L'*"/))#)'I-+$'&9#'<2%;"#'<#3%L'2=;/&#;'+-' 2%3%)&/""#;' A !/%%+&'=2""'&9#'-2L'+2&'I-+$'2%;#-';#=#%;#%&'<2%;"#)'
ggH' D763'P'O#Q+%;'&9#':Q&9'
d)@:)</$,A&./)&]:25)S+:7&
e>-2.)&2,-&4,$,<.299&9$@)?*?9)&+>):2;+,<&2:)&2&9$X9)&?+5>9$?2.)-& ! G9Qj' A (C3)8%L'<2%;"#'$/Q<#'<#'2)3%L'*"/))#)'I-+$'&9#'<2%;"#'<#3%L'2=;/&#;'+-' 2%3%)&/""#;' A !/%%+&'=2""'&9#'-2L'+2&'I-+$'2%;#-';#=#%;#%&'<2%;"#)' B+&-)29&S$./&./$<E&./)&@:25)S+:7&.:)2.<&4>-2.)&2,-&4,$,<.299&2<&2&.S+c<.)>& >:+?)<<& ! N=;/&#)'/%;'2%3%)&/"")';+'%+&'9/==#%'3$$#;3/&#"Q' ! @-/$#?+-0'$2)&'<#'k-#I-#)9#;l'&+'=2&'&9#$'3%&+'#p#*&' A 4*&2/""Q.'I+-'2=;/&#)'3&'3)'/'"3n"#'$+-#'*+$="3*/&#;'&9/%'&93).'<2&'?#'*/%' /**#=&'&93)'J3#?'I+-'%+?555'
ggR' D763'P'O#Q+%;'&9#':Q&9'
d)@:)</$,A&./)&]:25)S+:7&
e>-2.)&2,-&4,$,<.299&9$@)?*?9)&+>):2;+,<&2:)&2&9$X9)&?+5>9$?2.)-& ! G9Qj' A (C3)8%L'<2%;"#'$/Q<#'<#'2)3%L'*"/))#)'I-+$'&9#'<2%;"#'<#3%L'2=;/&#;'+-' 2%3%)&/""#;' A !/%%+&'=2""'&9#'-2L'+2&'I-+$'2%;#-';#=#%;#%&'<2%;"#)' B+&-)29&S$./&./$<E&./)&@:25)S+:7&.:)2.<&4>-2.)&2,-&4,$,<.299&2<&2&.S+c<.)>& >:+?)<<& ! N=;/&#)'/%;'2%3%)&/"")';+'%+&'9/==#%'3$$#;3/&#"Q' ! @-/$#?+-0'$2)&'<#'k-#I-#)9#;l'&+'=2&'&9#$'3%&+'#p#*&' A 4*&2/""Q.'I+-'2=;/&#)'3&'3)'/'"3n"#'$+-#'*+$="3*/&#;'&9/%'&93).'<2&'?#'*/%' /**#=&'&93)'J3#?'I+-'%+?555' l+S&-+&S)&:)@:)</&./)&@:25)S+:76&
ggZ' D763'P'O#Q+%;'&9#':Q&9'
F2?72A)&D-5$,&
]:25)S+:7&>:+Q$-)<&<>)?$29&DFO&.+&-)29&S$./&34,-9)<&$,.):2?;+,<&
gg]' D763'P'O#Q+%;'&9#':Q&9'
public interface PackageAdmin { static final int BUNDLE_TYPE_FRAGMENT = 0x00000001; Bundle getBundle(Class clazz); Bundle[] getBundles(String symbolicName, String 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); }
F2?72A)&D-5$,&
]:25)S+:7&>:+Q$-)<&<>)?$29&DFO&.+&-)29&S$./&34,-9)<&$,.):2?;+,<&
gg^' D763'P'O#Q+%;'&9#':Q&9'
public interface PackageAdmin { static final int BUNDLE_TYPE_FRAGMENT = 0x00000001; Bundle getBundle(Class clazz); Bundle[] getBundles(String symbolicName, String 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); } Provides various methods to introspect bundle dependencies
F2?72A)&D-5$,&
]:25)S+:7&>:+Q$-)<&<>)?$29&DFO&.+&-)29&S$./&34,-9)<&$,.):2?;+,<&
ggb' D763'P'O#Q+%;'&9#':Q&9'
public interface PackageAdmin { static final int BUNDLE_TYPE_FRAGMENT = 0x00000001; Bundle getBundle(Class clazz); Bundle[] getBundles(String symbolicName, String 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); } So, how do we gain access to this API?
D763'P'O#Q+%;'&9#':Q&9' ggd'
"):Q$?)&!:$),.2;+,&
B/)&!"#$&@:25)S+:7&>:+5+.)<&2&<):Q$?)c+:$),.)-&$,.):2?;+,&>2X):,&25+,A& 34,-9)<&
gge' D763'P'O#Q+%;'&9#':Q&9'
"):Q$?)&!:$),.2;+,&
B/)&!"#$&@:25)S+:7&>:+5+.)<&2&<):Q$?)c+:$),.)-&$,.):2?;+,&>2X):,&25+,A& 34,-9)<&
gHh' D763'P'O#Q+%;'&9#':Q&9'
Service Registry
"):Q$?)&!:$),.2;+,&
B/)&!"#$&@:25)S+:7&>:+5+.)<&2&<):Q$?)c+:$),.)-&$,.):2?;+,&>2X):,&25+,A& 34,-9)<&
gHg' D763'P'O#Q+%;'&9#':Q&9'
Y,:'51%# Service Registry Service Provider Service Description
"):Q$?)&!:$),.2;+,&
B/)&!"#$&@:25)S+:7&>:+5+.)<&2&<):Q$?)c+:$),.)-&$,.):2?;+,&>2X):,&25+,A& 34,-9)<&
gHH' D763'P'O#Q+%;'&9#':Q&9'
75"J# Service Requester Y,:'51%# Service Registry Service Provider Service Description
"):Q$?)&!:$),.2;+,&
B/)&!"#$&@:25)S+:7&>:+5+.)<&2&<):Q$?)c+:$),.)-&$,.):2?;+,&>2X):,&25+,A& 34,-9)<&
gHR' D763'P'O#Q+%;'&9#':Q&9'
75"J# Service Requester Y,:'51%# Service Registry Service Provider Service Description R5"J#
!"#$&"):Q$?)&D>>:+2?/&D-Q2,.2A)<&
Z$A/.S)$A/.&<):Q$?)<& ! U3-#*&'$#&9+;'3%J+*/8+%' ".:4?.4:)-&?+-)& ! B-+$+&#)')#=/-/8+%'+I'3%&#-I/*#'I-+$'3$="#$#%&/8+%' ! (%/<"#)'-#2)#.')2<)8&2&/<3"3&Q.'"++)#'*+2="3%L.'/%;'"/&#'<3%;3%L' V*,25$?<& ! T++)#'*+2="3%L'/%;'"/&#'<3%;3%L'$/0#'3&'=+))3<"#'&+')2==+-&'-2%K8$#' $/%/L#$#%&'+I'$+;2"#'
gHZ' D763'P'O#Q+%;'&9#':Q&9'
!"#$&D>>9$?2;+,<&
D&?+99)?;+,&+@&34,-9)<&./2.&$,.):2?.&Q$2&<):Q$?)&$,.):@2?)<& ! O2%;"#)'$/Q'<#'3%;#=#%;#%&"Q';#J#"+=#;'/%;';#="+Q#;' ! O2%;"#)'/%;'&9#3-'/))+*3/&#;')#-J3*#)'$/Q'/==#/-'+-';3)/==#/-'/&'/%Q'8$#' & d)<49;,A&2>>9$?2;+,&@+99+S<&2&"):Q$?)c!:$),.)-&=+5>+,),.&0+-)9&2>>:+2?/& ! !+$<3%#)'3;#/)'I-+$'<+&9'*+$=+%#%&'/%;')#-J3*#'+-3#%&/8+%'
gH]' D763'P'O#Q+%;'&9#':Q&9'
(4,-9)&Z$@)&=*?9)&`d)Q$<$.)-b&
gH^' D763'P'O#Q+%;'&9#':Q&9'
INSTALLED RESOLVED UNINSTALLED STARTING STOPPING ACTIVE &M4'5E5$# (,$.;(XE# 5"1$(''# ,4J($&# ,"5"1$(''# )&1.'8&# ,"5"1$(''# 1$()$# 1$.4#
(4,-9)&Z$@)&=*?9)&`d)Q$<$.)-b&
gHb' D763'P'O#Q+%;'&9#':Q&9'
RESOLVED UNINSTALLED &M4'5E5$# (,$.;(XE# ,4J($&# ,"5"1$(''# ,"5"1$(''# INSTALLED 5"1$(''# )&1.'8&# STARTING STOPPING ACTIVE 1$()$# 1$.4#
@?-*"-./'"'=8.$9&'"99<%2')3' 3<',#<*)$&'".$'82&'2&#*)?&2'
1/2.k<&2&"):Q$?)6&
U4<.&2&<$5>9)&U2Q2&+3G)?.& B*>$?299*&-)<?:$3)-&3*&2&U2Q2&$,.):@2?)& ! 4""+?)'I+-'$2"8="#'=-+J3;#-)' e<$,A&2&<):Q$?)&$<&G4<.&9$7)&4<$,A&2,*&+3G)?.&
gHd' D763'P'O#Q+%;'&9#':Q&9'
l)99+&1+:9-&"):Q$?)&P\25>9)&
Z).k<&2<<45)&S)&/2Q)&./$<&<):Q$?)&$,.):@2?)& & &
gHe' D763'P'O#Q+%;'&9#':Q&9'
package com.foo.hello; public interface Hello { void sayHello(String name); }
l)99+&1+:9-&"):Q$?)&P\25>9)&
Z).k<&2<<45)&S)&/2Q)&./$<&<):Q$?)&$,.):@2?)& & & & D,-&./$<&$5>9)5),.2;+,&
gRh' D763'P'O#Q+%;'&9#':Q&9'
package com.foo.hello; public interface Hello { void sayHello(String name); } package com.foo.hello.impl; import com.foo.hello; public class HelloImpl implements Hello { public void sayHello(String name) { System.out.println("Hello " + name + "!"); } }
F439$</$,A&2&"):Q$?)&`KaIb&
(4,-9)=+,.)\.&299+S<&34,-9)<&.+&>439$</&<):Q$?)<&
gRg' D763'P'O#Q+%;'&9#':Q&9'
public interface BundleContext { … void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException; 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); }
F439$</$,A&2&"):Q$?)&`KaIb&
(4,-9)=+,.)\.&299+S<&34,-9)<&.+&>439$</&<):Q$?)<&
gRH' D763'P'O#Q+%;'&9#':Q&9'
public interface BundleContext { … void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException; 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
F439$</$,A&2&"):Q$?)&`IaIb&
(4,-9)<&+R),&>439$</&<):Q$?)<&$,&./)$:&2?;Q2.+:&
gRR' D763'P'O#Q+%;'&9#':Q&9'
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( com.foo.hello.Hello.class.getName(), new HelloImpl(), null); } public void stop(BundleContext context) { m_reg.unregister(); } }
F439$</$,A&2&"):Q$?)&`IaIb&
(4,-9)<&+R),&>439$</&<):Q$?)<&$,&./)$:&2?;Q2.+:&
gRZ' D763'P'O#Q+%;'&9#':Q&9'
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( 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
F439$</$,A&2&"):Q$?)&`IaIb&
(4,-9)<&+R),&>439$</&<):Q$?)<&$,&./)$:&2?;Q2.+:&
gR]' D763'P'O#Q+%;'&9#':Q&9'
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( com.foo.hello.Hello.class.getName(), new HelloImpl(), null); } public void stop(BundleContext context) { m_reg.unregister(); } } We unregister it when stopping
F2?72A$,A&./)&l)99+&1+:9-&"):Q$?)&
!4:&<):Q$?)&$5>9)5),.2;+,&34,-9)&?+,.2$,<&./)<)&>2?72A)<& ! *+$5I++59#""+' ! *+$5I++59#""+53$="'
gR^' D763'P'O#Q+%;'&9#':Q&9'
F2?72A$,A&./)&l)99+&1+:9-&"):Q$?)&
!4:&<):Q$?)&$5>9)5),.2;+,&34,-9)&?+,.2$,<&./)<)&>2?72A)<& ! *+$5I++59#""+' ! *+$5I++59#""+53$="' D,-&./)&@+99+S$,A&52,$@)<.&5).2-2.2&
gRb' D763'P'O#Q+%;'&9#':Q&9'
Bundle-ManifestVersion: 2 Bundle-SymbolicName: com.foo.hello.impl Export-Package: com.foo.hello Import-Package: org.osgi.framework, com.foo.hello Bundle-Activator: com.foo.hello.impl.Activator
e<$,A&2&"):Q$?)&`KaIb&
(4,-9)=+,.)\.&299+S<&34,-9)<&.+&_,-&<):Q$?)<&
gRd' D763'P'O#Q+%;'&9#':Q&9'
public interface BundleContext { … void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException; 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); }
e<$,A&2&"):Q$?)&`KaIb&
(4,-9)=+,.)\.&299+S<&34,-9)<&.+&_,-&<):Q$?)<&
gRe' D763'P'O#Q+%;'&9#':Q&9'
public interface BundleContext { … void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException; 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 methods to find service references and get service objects
e<$,A&2&"):Q$?)&`IaIb&
(4,-9)<&:).:$)Q)&<):Q$?)&:)@):),?)<& ! V%;3-#*&'-#I#-#%*#)'&+')#-J3*#'+<F#*&'
gZh' D763'P'O#Q+%;'&9#':Q&9'
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( com.foo.hello.Hello.class.getName()); if (ref != null) { Hello h = (Hello) context.getService(ref); if (h != null) { h.sayHello("World"); context.ungetService(h); } } } … }
e<$,A&2&"):Q$?)&`IaIb&
(4,-9)<&:).:$)Q)&<):Q$?)&:)@):),?)<& ! V%;3-#*&'-#I#-#%*#)'&+')#-J3*#'+<F#*&'
gZg' D763'P'O#Q+%;'&9#':Q&9'
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( 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
e<$,A&2&"):Q$?)&`IaIb&
(4,-9)<&:).:$)Q)&<):Q$?)&:)@):),?)<& ! V%;3-#*&'-#I#-#%*#)'&+')#-J3*#'+<F#*&'
gZH' D763'P'O#Q+%;'&9#':Q&9'
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( 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
e<$,A&2&"):Q$?)&`IaIb&
(4,-9)<&:).:$)Q)&<):Q$?)&:)@):),?)<& ! V%;3-#*&'-#I#-#%*#)'&+')#-J3*#'+<F#*&'
gZR' D763'P'O#Q+%;'&9#':Q&9'
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( 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
e<$,A&2&"):Q$?)&`IaIb&
(4,-9)<&:).:$)Q)&<):Q$?)&:)@):),?)<& ! V%;3-#*&'-#I#-#%*#)'&+')#-J3*#'+<F#*&'
gZZ' D763'P'O#Q+%;'&9#':Q&9'
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( 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
F2?72A$,A&./)&l)99+&1+:9-&"):Q$?)&
!4:&?9$),.&$5>9)5),.2;+,&34,-9)&?+,.2$,<&./$<&>2?72A)& ! *+$5I++59#""+5*"3#%&' D,-&./)&@+99+S$,A&52,$@)<.&5).2-2.2&
gZ]' D763'P'O#Q+%;'&9#':Q&9'
Bundle-ManifestVersion: 2 Bundle-SymbolicName: com.foo.hello.client Import-Package: com.foo.hello,
- rg.osgi.framework
Bundle-Activator: com.foo.hello.client.Activator
"):Q$?)&V*,25$<5&
"):Q$?)<&?2,&3)&>439$</)-&2,-&:)Q+7)-&2.&:4,&;5)& ! 7#-J3*#'#J#%&)')3L%/"')#-J3*#'*9/%L#)' A :2)&'&-/*0'#J#%&)'I+-'/%Q')#-J3*#)'<#3%L'2)#;'
gZ^' D763'P'O#Q+%;'&9#':Q&9'
N.#'51$&"#D.)#&8&"$1# BundleContext.addServiceListener()
"):Q$?)<&V*,25$<5&
"):Q$?)<&?2,&3)&>439$</)-&2,-&:)Q+7)-&2.&:4,&;5)& ! 7#-J3*#'#J#%&)')3L%/"')#-J3*#'*9/%L#)' A :2)&'&-/*0'#J#%&)'I+-'/%Q')#-J3*#)'<#3%L'2)#;'
gZb' D763'P'O#Q+%;'&9#':Q&9'
!;4'&;&"$#'51$&"&)#5"$&)D(E&# public interface ServiceListener extends EventListener { public void serviceChanged(ServiceEvent event); }
"):Q$?)<&V*,25$<5&
"):Q$?)<&?2,&3)&>439$</)-&2,-&:)Q+7)-&2.&:4,&;5)& ! 7#-J3*#'#J#%&)')3L%/"')#-J3*#'*9/%L#)' A :2)&'&-/*0'#J#%&)'I+-'/%Q')#-J3*#)'<#3%L'2)#;'
gZd' D763'P'O#Q+%;'&9#':Q&9'
e&E&58&J#&8&"$# public class ServiceEvent extends EventObject { public final static int REGISTERED = 0x00000001; public final static int MODIFIED = 0x00000002; public final static int UNREGISTERING = 0x00000004; … public ServiceReference getServiceReference() { … } public int getType() { … } }
"):Q$?)<&V*,25$<5&
"):Q$?)<&?2,&3)&>439$</)-&2,-&:)Q+7)-&2.&:4,&;5)& ! 7#-J3*#'#J#%&)')3L%/"')#-J3*#'*9/%L#)' A :2)&'&-/*0'#J#%&)'I+-'/%Q')#-J3*#)'<#3%L'2)#;'
gZe' D763'P'O#Q+%;'&9#':Q&9'
e&E&58&J#&8&"$# public class ServiceEvent extends EventObject { public final static int REGISTERED = 0x00000001; public final static int MODIFIED = 0x00000002; public final static int UNREGISTERING = 0x00000004; … public ServiceReference getServiceReference() { … } public int getType() { … } } Even though service are just normal objects, they are potentially much more volatile, so service events are very important
"):Q$?)c(2<)-&V*,25$?&P\.),<$3$9$.*&
"):Q$?)&)Q),.<&>:+Q$-)&2&5)?/2,$<5&@+:&-*,25$?&)\.),<$3$9$.*& B/)&S/$.)3+2:-&>2X):,& ! a-#/&)'&9#')#-J3*#'-#L3)&-Q'/)'/'?93&#<+/-;' A 4'-#J#-)#'?/Q'&+'*-#/&#'/')#-J3*#' ! 4%'/=="3*/8+%'*+$=+%#%&'"3)&#%)'I+-')#-J3*#)'+I'/'=/-8*2"/-'&Q=#'&+'<#'/;;#;' /%;'-#$+J#;' ! D%'/;;38+%.'&9#')#-J3*#'3)'3%&#L-/&#;'3%&+'&9#'/=="3*/8+%' ! D%'-#$+J/".'&9#')#-J3*#'3)'-#$+J#;'I-+$'&9#'/=="3*/8+%'
g]h' D763'P'O#Q+%;'&9#':Q&9'
1/$.)3+2:-&F2X):,&
- %(4&#
5;4'# W.)&# Tracker Frame
g]g' D763'P'O#Q+%;'&9#':Q&9'
Framework Service registry
1/$.)3+2:-&F2X):,&
e&*51$&)# 1&)85E&#'51$&"&)#
g]H' D763'P'O#Q+%;'&9#':Q&9'
Framework Service registry W.)&# Tracker Frame
- %(4&#
5;4'#
1/$.)3+2:-&F2X):,&
- &)85E&#
4,:'5E(X."#
- %(4&#
5;4'#
g]R' D763'P'O#Q+%;'&9#':Q&9'
Framework Service registry W.)&# Tracker Frame
1/$.)3+2:-&F2X):,&
- &)85E&#
&8&"$#
- %(4&#
5;4'#
g]Z' D763'P'O#Q+%;'&9#':Q&9'
Framework Service registry W.)&# Tracker Frame
1/$.)3+2:-&F2X):,&
- &)85E&#
)&d,&1$#
- %(4&#
5;4'#
g]]' D763'P'O#Q+%;'&9#':Q&9'
Framework Service registry W.)&# Tracker Frame
1/$.)3+2:-&F2X):,&
- &)85E&#:5"J5"*#
- %(4&#
5;4'#
g]^' D763'P'O#Q+%;'&9#':Q&9'
Framework Service registry W.)&# Tracker Frame
1/$.)3+2:-&F2X):,&
- %(4&#
5;4'#
g]b' D763'P'O#Q+%;'&9#':Q&9'
Framework Service registry W.)&# Tracker Frame
1/$.)3+2:-&F2X):,&
7.)#$%&#)&8&)1&L#5D#$%%(4&)85E&# 51#)&;.8&JL#$%&#$)(EC&)#)&;.8&1#5$1# (11.E5($&J#1%(4&A#
- %(4&#
5;4'#
g]d' D763'P'O#Q+%;'&9#':Q&9'
Framework Service registry W.)&# Tracker Frame
"):Q$?)&F2$,.&F:+A:25&!Q):Q$)S&
V*,25$?299*&)\.),<$39)&>2$,.&>:+A:25&& ! N)#)'&9#'?93&#<+/-;'=/n#-%'&+';#"3J#-')9/=#)' ! a9#'=/3%&'<2%;"#'"3)&#%)'I+-')9/=#')#-J3*#)'&9/&'*+$#'/%;'L+' ! N)#)')#-J3*#'=-+=#-8#)'I+-'&9#'%/$#'/%;'3*+%'+I'&9#')9/=#' e<)<&>92?)/+9-):&S/),&</2>)&/2<&3)),&4<)-E&34.&$<&?4::),.9*&4,2Q2$9239)& 3)?24<)&./)&<):Q$?)&$<&,+.&2Q2$9239)&
g]e' D763'P'O#Q+%;'&9#':Q&9'
"):Q$?)&F2$,.&F:+A:25&V)<$A,&`KaIb&
g^h' D763'P'O#Q+%;'&9#':Q&9'
Paint Frame Simple Shape Shape Component Circle Square Triangle b# c# b# c# Shape Service Tracker Default Shape
"):Q$?)&F2$,.&F:+A:25&V)<$A,&`IaIb&
D763'P'O#Q+%;'&9#':Q&9' g^g'
Shape Paint
&M4.)$# .)*AD..A1%(4&#
Circle Square Triangle
=/299),A)<&+@&V*,25$<5&
(+./&34,-9)<&2,-&<):Q$?)<&2:)&-*,25$?& !"#$&$<&$,/):),.9*&549;c./:)2-)-& B/$<&5)2,<&*+4&/2Q)&.+&-)29&S$./&./)&@2?.&./2.& ! q+2-'/=="3*/8+%'?3""'"30#"Q')##'$2"8="#'&9-#/;)' ! 4=="3*/8+%'*+$=+%#%&)'*/%'/==#/-'+-';3)/==#/-'/&'/%Q'8$#' B/):)&$<&/)9>& ! 7#-J3*#'a-/*0#-' ! 7#-J3*#'!+$=+%#%&':+;#"'P'U#*"/-/8J#'7#-J3*#).'3BDED.'O"2#=-3%&'
g^H' D763'P'O#Q+%;'&9#':Q&9'
D763'P'O#Q+%;'&9#':Q&9' g^R'
1/2.&2&>2$,&T&
0+-492:$.*&2,-&V*,25$<5&2:)&.S+&:)299*&$,.):)<;,A&>:+>):;)<& ! N)3%L'3&'"++0)'/'%3L9&$/-#r' ! :3L-/8%L'&+'D763.'"++0)'&#--3<"#' D99&2<>)?.<&2:)&$5>+:.2,.&$,&!"#OE&)<>)?$299*&/2:-)<.&+,)<'& ! B/*0/L3%L' ! :2"8&9-#/;3%L'/%;')Q%*9-+%3S/8+%' ! !"/))"+/;3%L' &
g^Z' D763'P'O#Q+%;'&9#':Q&9'
F2$,&d)9$)Q):<&
F2?72A$,A& ! O_U.'O_Ua++")' ! 7=-3%L7+2-*#'O2%;"+-'X?-/==3%LY' ! 4=/*9#'@#"3C'73L3".':/J#%KaQ*9+W' "):Q$?)&=+5>+,),.&d4,;5)&`-)>),-),?*&$,G)?;+,b& ! U#*"/-/8J#'7#-J3*#).'O"2#=-3%&' ! 4=/*9#'@#"3C'3BDED' P,.):>:$<)&!"#$& ! 4=/*9#'4-3#)' ! (*"3=)#'6#$3%3.'c3-L+' D-5$,$<.:2;+,&.++9<&2,-&V)>9+*5),.& ! G#<'!+%)+"#' ! DO\' &
g^]' D763'P'O#Q+%;'&9#':Q&9'
D763'P'O#Q+%;'&9#':Q&9' g^^'
(MV&
(MV& ! M+?'&+'$/0#'<2%;"#)'#/)3"Q' ! U#)*-3=8+%'+I'&9#'<2%;"#'*+%&#%&'3%'&#-$'+I' A V$=+-&#;[(C=+-&#;[B-3J/&#'=/*0/L#)' A \#)+2-*#)' A ($<#;;#;'E/-' ! !+$=2&#'&9#'*+--#*&'$#&/;/&/' ]:+,.),-<& ! !+$$/%;'T3%#' ! 4%&' ! :/J#%'X$/J#%K<2%;"#K="2L3%Y' ! O%;a++"'X(*"3=)#'B"2L3%Y' & & '
g^b' D763'P'O#Q+%;'&9#':Q&9'
PM4.)$?Y(EC(*&>#E.;AD..A(E;&[#8&)15."]bA`## Y)58($&?Y(EC(*&>#E.;AD..A(E;&A5;4'# +("5D&1$?f&)15.">#b# #R,"J'&?0(;&>#E.;AD..A(E;&# #Y)58($&?Y(EC(*&>#E.;AD..A(E;&A5;4'# #!;4.)$?Y(EC(*&>#E.;AD..A(E;&[8&)15."]bA`L# ###.)*A.1*5AD)(;&2.)C[#8&)15."]bA9# R,"J'&?+("5D&1$f&)15.">#G# #R,"J'&?-F;:.'5E0(;&>#E.;AD..A(E;&# #PM4.)$?Y(EC(*&>#E.;AD..A(E;&[8&)15."]bA`# #R,"J'&?f&)15.">#`#
52Q),c34,-9)c>94A$,&
g^d' D763'P'O#Q+%;'&9#':Q&9'
g4',*5"h# ##g*).,4!Jh.)*A(4(E%&AD&'5Mgi*).,4!Jh# ##g()XD(E$!Jh;(8&"?:,"J'&?4',*5"gi()XD(E$!Jh# ##g&M$&"15."1h$),&gi&M$&"15."1h# ##gE."Z*,)(X."h# ####g5"1$),EX."1h# #######gPM4.)$?Y(EC(*&h# ########E.;AD..A(E;&[#8&)15."]bA`A`# #######giPM4.)$?Y(EC(*&h# #######gY)58($&?Y(EC(*&h# ########E.;AD..A(E;&A5;4'# #######giY)58($&?Y(EC(*&h# ####gi5"1$),EX."1h# ##giE."Z*,)(X."h# gi4',*5"h#
B/)&m/+S&.+&_,-&34,-9)n&-$9)552&
l+S&.+&.:2,<@+:5&2&>92$,&U2:&$,.+&2&(4,-9)& ! O_U'/%;'O2%;"+-')2==+-&'&93)'2)#'*/)#'+2&'+I'&9#'<+C' ! !+$$+%'7&-/&#LQ' A (C=+-&'/""'=/*0/L#)'X#C*#=&'s53$=".'s53%&#-%/")Y' A !+$=2&#'3$=+-&)'X/)'+=8+%/"Y' O<&$.&A++-&6& ! U+'%+&'$/%/L#'&9#'J3)3<3"3&Q.'+=8+%/"3&Q.'-#t#*8+%' ! U+'%+&'2)#')#-J3*#)' P\$<;,A&:)>+<$.+:$)<& ! 7=-3%L'7+2-*#'P'9n=)P[[#<-5)=-3%L)+2-*#5*+$[-#=+)3&+-Q[/==[' ! 7#-J3*#':3C'P'9n=P[[)#-J3*#$3C5/=/*9#5+-L[7:uZ[<2%;"#)K-#=+)3&+-Q59&$"' ! !9/$#"#+%'!+$$+%'P 9n=P[[?3035*9/$#"#+%5+?H5+-L[C?303[<3%[J3#?[:/3%[G#<M+$#' ! 4'"+&'+I'=-+F#*&)'/-#'/"-#/;Q'D763K/?/-#'r'
g^e' D763'P'O#Q+%;'&9#':Q&9'
D763'P'O#Q+%;'&9#':Q&9' gbh'
"):Q$?)c=+5>+,),.&0+-)9&
1/*&6& ! 73$="3`*/8+%'+I'&9#';#J#"+=$#%&'$+;#"' A UQ%/$3)$' A :/%/L#$#%&' A \#*+%`L2-/8+%' ! 4-*93&#*&2-/"'J3#?' ! 4""+?'&+'#/)3"Q'*-#/&#')+=93)8*/&#;'/=="3*/8+%)' &
gbg' D763'P'O#Q+%;'&9#':Q&9'
"):Q$?)c=+5>+,),.&0+-)9&
1/*&6& ! 73$="3`*/8+%'+I'&9#';#J#"+=$#%&'$+;#"' A UQ%/$3)$' A :/%/L#$#%&' A \#*+%`L2-/8+%' ! 4-*93&#*&2-/"'J3#?' ! 4""+?'&+'#/)3"Q'*-#/&#')+=93)8*/&#;'/=="3*/8+%)' "):Q$?)c=+5>+,),.&5+-)9<& ! V%I2)#')#-J3*#K+-3#%&#;'$#*9/%3)$)'3%'/'*+$=+%#%&'$+;#"' ! B-+J3;#' A 73$="#';#J#"+=$#%&'$+;#"' A 4-*93&#*&2-/"'J3#?).'*+$=+)38+%'$#*9/%3)$)'
gbH' D763'P'O#Q+%;'&9#':Q&9'
P\$<;,A&"):Q$?)&=+5>+,),.&0+-)9<&
V)?92:2;Q)&"):Q$?)<& ! 7=#*3`#;'3%'D763'\Z'' ! U#`%#'/';#*"/-/8J#'*+$=+%#%&'$+;#"'&+';#/"'?3&9'&9#')#-J3*#';Q%/$3)$' (94)>:$,.& ! 7=#*3`#;'3%'&9#'D763'(%&#-=-3)#'B-+`"#' ! 7=-3%L'+%'&9#'&+='+I'D763' ! O#/%)'*/%'2)#')#-J3*#)'/%;'<#'#C=+)#;'/)')#-J3*#)' D>2?/)&])9$\&$F!U!& ! BDEDK</)#;'*+$=+%#%&'$+;#"' ! (C&#%)3<"#' A V)'%+&'"3$3&#;'&+';Q%/$3)$' ! 72==+-&)'/%%+&/8+%)' ! a9#'$+)&'/;J/%*#;'&+;/Q' ! 9n=P[[3=+F+5+-L'
gbR' D763'P'O#Q+%;'&9#':Q&9'
F:+Q$-$,A&./)&"/2>)&<):Q$?)&S$./&$F!U!&
gbZ' D763'P'O#Q+%;'&9#':Q&9'
@Component @Provides public class Circle implements SimpleShape { @ServiceProperty(name=SimpleShape.NAME_PROPERTY) private String name; @ServiceProperty(name=SimpleShape.ICON_PROPERTY) private ImageIcon icon; @Validate public void start() { icon = new ImageIcon(this.getClass().getResource ("circle.png"))); name = "Circle"; } public void draw(Graphics2D g2, Point p) { // Draw a circle } }
d)84$:$,A&</2>)<&S$./&$F!U!&
gb]' D763'P'O#Q+%;'&9#':Q&9'
@Component @Instantiate public class Host { public Host() { // Create the frame... } @Bind public synchronized void bindShape(SimpleShape shape) { // Update the frame } @Unbind public synchronized void unbindShape(SimpleShape shape) { // Update the frame } //... }
1/2.&$F!U!&52,2A)<&@+:&*+4&6&
"):Q$?)<& ! U#=#%;#%*3#)P';Q%/$3)$.')Q%*9-+%3S/8+%' ! 7#-J3*#'B-+J3;3%LP'=2<"3*/8+%.')#-J3%L.')#-J3*#'=-+=#-8#).'2=;/&#)' Z$@)?*?9)& ! V%)&/%*#'"3I#*Q*"#' ! !/""</*0)' ! !+%&-+""/<"#r' !./):<& ! 4)Q%*9-+%+2)'*+$$2%3*/8+%' ! (C&#%;#-'=/n#-%.'G93&#<+/-;'=/n#-%' ! E:u' ! a-/%)/*8+%.'EB4W' ! P\.),<$39)T&
gb^' D763'P'O#Q+%;'&9#':Q&9'
1/2.&$F!U!&52,2A)<&@+:&*+4&6&
]2?.+:*&a&O,<.2,?)&-$<;,?;+,& ! v!+$=+%#%&'wx'!+$=+%#%&'aQ=#' ! q+2'*/%'*-#/&#')#J#-/"'3%)&/%*#'I-+$'&9#')/$#'&Q=#'?3&9';3p#-#%&'*+%`L2-/8+%)' A R')9/=#)'X3%)&/%*#)Y.'g'*+$=+%#%&'&Q=#' 02,2A)5),.& ! V%&#-/*8+%'?3&9'&9#'D763'!+%`L'4;$3%' ! G#<!+%)+"#'B"2L3%' ! V%&-+)=#*&/<"#' O,G)?;+,& ! O/)#;'+%'<Q&#*+;#'#%9/%*#$#%&' A Dy3%#'+-'V%)&/""K8$#' A a#)&#;'+%'/'"+&'+I'Ec:)' ! @3#";'3%F#*8+%' ! :#&9+;'*/""</*0' ! !+%)&-2*&+-'3%F#*8+%'
gbb' D763'P'O#Q+%;'&9#':Q&9'
1/):)&$F!U!&$<&4<)-6&
D>>9$?2;+,<&"):Q):<& ! M+$#'6/&#?/Q' ! \@VU'723&#' ! E(('4=="3*/8+%'7#-J#-'XDGH'ED%47Y' ' "*<.)5& ! V%)2-/%*#')+>?/-#)' ! ($<#;;#;';#J3*#)' !./):<& ! U#)0&+='/=="3*/8+%)'X7?3%L.'7Ga.'zaWY' ! 4%;-+3;'' ! :+<3"#'6/$#)'X2647BY'
gbd' D763'P'O#Q+%;'&9#':Q&9'
D763'P'O#Q+%;'&9#':Q&9' ge]'
P,.):>:$<)&!"#$&
O,.)A:2.)&UPP&B)?/,+9+A$)<&$,.+&!"#$'&!,)&A+29E&BS+&.:),-<'& P,.):>:$<)&!"#$&'&./)&<>)?$_?2;+,& ! @3-)&')=#*3`*/8+%'-#"#/)#;'3%':/-*9'Hhgh' ! U#`%#)' A G#<'4=="3*/8+%)'XG4O)Y' A \#$+&#'7#-J3*#).'7!4'U#`%38+%)' A Es'P'EUO!.'E_UV.'Ea4.'EB4.'E:u' l*3:$-&2>>9$?2;+,&<):Q):<& ! E(('/=="3*/8+%')#-J#-)'-#"Q3%L'+%'D763'/%;'#C=+)3%L'D763' A DGH'E+_47.'D-/*"#'6"/))`)9.'VO:'G#<)=9#-#' A \#;9/&'E<+))' ! D763'4=="3*/8+%)'2)3%L'E((')#-J3*#)'{'E(('*+$=+%#%&)'2)3%L'D763')#-J3*#)' ! 9n=P[[<"+L5/0123%#&5;#[Hhhe[hb[Hb[F+%/)K)9+?*/)#K9/J3%LK&9#K<#)&K+IKF##K /%;K+)L3['
ge^' D763'P'O#Q+%;'&9#':Q&9'
P?9$><)&#)5$,$&
geb' D763'P'O#Q+%;'&9#':Q&9'
"+RS2:)&"4$.)&?+,.2$,$,A&P,.):>:$<)c.)?/,+9+A$)<&<4>>+:.& ! \#I#-#%*#'V$="#$#%&/8+%'I+-'$/%Q'+I'&9#'(%&#-=-3)#'D763'7=#*3`*/8+%)' ! !+%&/3%)' A O"2#=-3%&' A G#<'!+%&/3%#-' A EB4' A EUO!' A E:u' A E_UV' A W'
D>2?/)&D:$)<&
ged' D763'P'O#Q+%;'&9#':Q&9'
O5>9)5),.2;+,<&2,-&)\.),<$+,<&+@&./)&P,.):>:$<)&!"#$&">)?$_?2;+,<& ! !+%&/3%)' A O"2#=-3%&' A EB4' A Ea4' A EUO!' A E:u' A 7BV' A E_UV' A W' ! 4))#$<"Q'['4=="3*/8+%'I+-$/&P'(O4'
P?9$><)&W$:A+&
gee' D763'P'O#Q+%;'&9#':Q&9'
!:$A$,299*&">:$,A"+4:?)&-5"):Q):&`-*,25$?&5+-49)<b& ! H-65#?#<'*+%&/3%#-# A 4=="3*/8+%';#)*-3=8+%.';#="+Q$#%&'/%;'$/%/L#$#%&'P'B"/%).'3)+"/&#;.' /&+$3*)' A B-+J3)3+%3%LP'B4\)' A T#L/*Q'"3<-/-3#)' A 4;$3%3)&-/8+%' A a++"3%L)'
!./):<&
d)5+.)&"):Q$?)<& ! !u@'U3)&-3<2&#;'D763' A G#<'7#-J3*#)' ! DGH'!9/$#"#+%'\+)#' A a#*9%+"+LQ'/L%+)8*)' A E7D_\B!.'G#<'7#-J3*#.'\(7a'XE#-)#QYW' V$<.:$34.)-&PQ),.<& ! (J#%&'4;$3%'<-3;L#)' ! DGH'\+)#'E:7'O-3;L#)'X/*8J#:z.'M+-%#&z.'E+-/$Y' P"(<& ! 7#-J3*#':3C' ! !/$#"'
Hhh' D763'P'O#Q+%;'&9#':Q&9'
D763'P'O#Q+%;'&9#':Q&9' Hhg'
D>2?/)&])9$\&1)3&=+,<+9)&
D763'P'O#Q+%;'&9#':Q&9' HhH'
D>2?/)&D?)&
"+RS2:)&V$<.:$34;+,&@:25)S+:7& ! O/)#;'+%'D763' A @+-'D763'<2&'%+&'+%"Q' ])2.4:)<& ! !-#/8+%'+I';#="+Q$#%&'=/*0/L#' A 4""+?'&+'=2)9'3%)&/""/8+%'&+'/')#&'+I'L/&#?/Q' A 72==+-&'3%)&/""/8+%)'['2=;/&#)'['2%3%)&/""/8+%)' A B2""'/%;'B2)9' ! U#=#%;#%*Q':/%/L#$#%&' A 7$/-&';#="+Q$#%&' ! 7*/"/<3"3&Q' A _+&'"3$3&#;'3%'&#-$)'+I'/;$3%3)&#-#;'L/&#?/Q)' ! 9n=P[[3%*2</&+-5/=/*9#5+-L[/*#['
HhR' D763'P'O#Q+%;'&9#':Q&9'
!./):<&
B/):)&2:)&2&9+.&+@&.++9<& & F:+Q$<$+,$,A& ! D763'O2%;"#'\#=+)3&+-QP'U#="+Q$#%&')+"28+%'&+'-#)+"J#';#=#%;#%*3#)' ! (*"3=)#'BH' d)5+.)&2-5$,$<.:2;+,& ! E:u' ! 77M'\#$+&#'79#""' ! c3)2/"c:'D763'B"2L3%'X;#J#"+=#;'+%'DGH'!9/$#"#+%Y' &
HhZ' D763'P'O#Q+%;'&9#':Q&9'
D763'P'O#Q+%;'&9#':Q&9' Hh]'
!"#$&?2,&3)&2&:)299*&A++-&.)?/,+9+A*&
Hh^' D763'P'O#Q+%;'&9#':Q&9'
0$,-&./)>&
Hhb' D763'P'O#Q+%;'&9#':Q&9'
0+-492:$.*&2,-&V*,25$<5&2:)&/2:-&
V+,n.&)\?)>.&<+5)./$,A&)2<*& ! :+;2"/-3&Q'3)'lDdV'r' A G-38%L'$+;2"/-'*+;#'3)'9/-;' A :+;2"/-3S3%L'#C3)8%L'*+;#'3)'/'"+&'9/-;#-' ! O3LL#-'3)'Q+2-'*+;#</)#.'9/-;#-'3&'?3""'<#' A !+$="#C'*+;#'X-#t#*8+%.';Q%/$3*'"+/;3%LY'*/%'<#'-#/""Q'/'%3L9&$/-#' ! a93%0'/<+2&'?9/&'Q+2-'/-#';+3%L'r' A G9/&|)'&9#'=+3%&'j' A G9Q'/-#'Q+2';+3%L')2*9'03%;'+I'I/%*Q'$#*9/%3)$'
" @+-L#&'&9#'kE2)&'@+-'@2%l'/%)?#-' " o))>&$.&<$5>9)&
&
Hhd' D763'P'O#Q+%;'&9#':Q&9'
!"#$&
1)kQ)&<)),&299&!"#$&/2<&.+&+C):& ! :+;2"#'"/Q#-' ! T3I#*Q*"#'"/Q#-' ! 7#-J3*#'"/Q#-' 1/$9)&./):)&2:)&>9),.*&+@&5+:)&-).2$9<&.+&./)<)&92*):<E&*+4&</+49-&,+S&3)& @25$9$2:&S$./&./)&5+<.&$5>+:.2,.&>2:.<& ! a9#'$+)&'*+$$+%"Q'2)#;[%##;#;'I#/&2-#)' ! a9#'$+)&'*+$$+%"Q'2)#;'=/n#-%)' D&9+.&+@&.++9<&2:)&2Q2$9239)E&4<)&./)5&T& ! (C3)8%L')#-J3*#)' ! !+$=+%#%&':+;#")' &
Hhe' D763'P'O#Q+%;'&9#':Q&9'
1:$;,A&0+-492:&=+-)&
=2:)@499*&52,A)&*+4:&>2?72A)<& ! 4J+3;')="3&'=/*0/L#' ! 7#=/-/&#')=#*3`*/8+%'['3$="#$#%&/8+%' ! B/*0/L#')=#*3`*/8+%)'3%'&9#3-'+?%'<2%;"#' DQ+$-&=92<<f@+:M25)& ! _+'L"+</"'J3)3<3"3&Q'3%'D763' ! VI'-#/""Q'%##;'<#.'L3J#'&9#'*+--#*&'*"/))"+/;#-' e<)&"):Q$?)<& ! N)#'7#-J3*#)'rrr' e<)&?+5>+,),.&5+-)9<& ! U+%|&'2)#'&9#'D763'4BV'U3-#*&"Q' & &
Hgh' D763'P'O#Q+%;'&9#':Q&9'
d)?+55),-2;+,<&
Hgg' D763'P'O#Q+%;'&9#':Q&9'
+06)').'@?-<.' e5E%()J#-A#j(''L#k()'#Y(,'1L#-$,()$#+EW,''.E%L#O(85J#-(8(*&#
p4)<;+,<&6&
D763'P'O#Q+%;'&9#':Q&9' HgH'
k()'#Y(,'1# C()'A4(,'1l(Cd,5"&$AJ&# Rm'.21$)(n&#ooL#b`pq9#R&)'5"# r_s#bab#GGo#_s#q_a#
#
O)A#W'&;&"$#P1E.t&)# E'&;&"$A&1E.t&)l(Cd,5"&$AJ&# Rm'.21$)(n&#ooL#b`pq9#R&)'5"# r_s#bpa#G_oppbp#