SlideShare une entreprise Scribd logo
1  sur  25
peaberry Stuart McCulloch
Today's menu Origin of peaberry OSGi-fying Guice Service providers Service registry abstraction Blending services & extensions Future ideas
Origin Began as lab project at community site new annotations @Inject @OSGiService("(Currency=GBP)") StockQuote quote; patched Guice to support service “auto-binding” @OSGiService(...) StockQuote quote; // magically added for you bind(StockQuote.class)...
Simplification Auto-binding introduced too much magic @Inject @OSGiService("(Currency=GBP)") StockQuote quote; NO new annotations service bindings now explicit, just like pure Guice  aim to be a true extension to Guice – no patches! so...
Squeezing Guice into a bundle Guice now has OSGi metadata thanks to Guice's type-safety meant no major classloading issues ... but AOP proxies initially didn't work in OSGi AOP proxies need to see client types AOP support types BND internal &
Bridge class loader Don't want to expose AOP internals (repackaged CGLIB) parent parent com.google.inject.internal.* loadClass loadClass so load proxy classes using “bridge” class loaders
Bridge class loader (2) No dependency on OSGi ! – only used when needed of bridge classloaders allows re-use ... as well as eager unloading of proxy classes BUT cannot apply bridging to  package-private  types as not visible from other classloaders weak cache
Why peaberry? Guice can now be used in OSGi – so what's missing? no support for dynamic OSGi services! each injector uses immutable set of explicit bindings so ... new  Injector  on every service change? or ...  Provider<T>  that returns dynamic proxies? :( :)
Service Provider @Inject StockQuote quote; quote.price(“JAVA”); get unget price injector get K P K P K P P Service Registry p r o x y p r o x y
Service binding Fluent API helps you get the right service  Provider<T> bind( iterable( A.class ) ).toProvider( service( A.class ).multiple() ); @Inject A bestService; @Inject Iterable<A> allServices; // each element is a proxy import static org.ops4j.peaberry.Peaberry.service; import static org.ops4j.peaberry.util.TypeLiterals.iterable; * bind( A.class ).toProvider( service( A.class ).single() );
Service binding (2) So is that it? s:
Service binding (2) So is that it? ... no, you can also service( A.class ).filter( /* apply a filter */ )... service( A.class ).in( /* query a specific registry */ )... service( A.class ).out( /* watch for service changes */ )... service( A.class ).decoratedWith( /* apply decoration */ )... each stage of the builder creates an immutable copy which means you can share and re-use builders
Service Registry public   interface  ServiceRegistry { <T> Iterable<Import<T>> lookup(Class<T> clazz, AttributeFilter filter); <T>  void  watch(Class<T> clazz, AttributeFilter filter, ServiceWatcher<?  super  T> watcher); } public   interface  AttributeFilter { boolean  matches(Map<String, ?> attributes); } Pluggable API – integrate all kinds of service registries simple, allows lazines s z z z , no dependency on OSGi service filters not just limited to LDAP strings but we do provide an LDAP adapter (among others)
Import public   interface  Import<T> { T get();  // may throw unchecked ServiceUnavailableException Map <String, ?> attributes(); void  unget(); boolean  available(); } Tracking service use is very important ! public   interface  ImportDecorator<S> { <T  extends  S> Import<T> decorate(Import<T> service); } can easily apply deco to change dynamic behaviour (e.g. sticky services) ation to imported services
Concurrent Import public   synchronized  T get() { count ++; if  ( null  ==  service ) { final  Iterator<Import<T>> i =  services .iterator(); if  (i.hasNext()) { service  = i.next(); instance  =  service .get(); } } return   instance ; } public   synchronized   void  unget() { if  (0 == -- count  &&  null  !=  service ) { final  Import<T> temp =  service ; instance  =  null ; service  =  null ; temp.unget(); } } Single services wrap iterables to look like single imports avoids thread-locals, provides basic service affinity
Export What's the opposite of a imported service? hint
Export public   interface  Export<T> { void  put(T instance); void  attributes(Map<String, ?> attributes); void  unput(); } Can alter/remove exported instance, update attributes public   interface  ServiceWatcher<S> { <T  extends  S> Export<T> add(Import<T> service); } watchers can receive imports and (re-)export them but wait, isn't a registry a bit like a watcher?
Service Registry (revisited) public   interface  ServiceRegistry extends  ServiceWatcher<Object> {  // etc... public   interface  Export<T> extends  Import<T> {  // etc... which leads to interesting possibilities ... Yes, and exports are also related to imports // like pushing services from one registry to another for (Import<A> i : extensionRegistry.lookup(A.class, null)) { serviceRegistry.add(i); } but you  don't  have to use the raw API  to export
Service binding (revisited) Exported service handles can be injected bind( export( A.class ) ).toProvider( service( (A)null ).export() ); @Inject Export<A> exportedService; import static org.ops4j.peaberry.Peaberry.service; import static org.ops4j.peaberry.util.TypeLiterals.export; * bind( export( A.class ) ).toProvider( service( aImpl ).export() ); otherwise published when export handle is created can defer publishing a service by passing in null
Eclipse extensions Eclipse has its own registry for plug-in this is like another service registry, but less dynamic extensions so ... how can we map the service class to an instance? take inspiration from Eclipse Riena, use bean mapping ! unless its a compatible executable extension OR  we're looking up  IconfigurationElement  class
Mapping extensions Use  @MapName,   @MapContent  from peaberry or Riena Same approach as Riena for mapping bean types But use  @ExtensionBean  to configure point id @ExtensionBean(&quot;examples.menu.items&quot;) public interface Item { String getLabel(); @MapName(&quot;label&quot;) String toString(); @MapContent String getContent(); }
Injecting extensions <extension point=&quot;org.eclipse.ui.views&quot;> <view name=&quot;Message&quot; allowMultiple=&quot;true&quot; icon=&quot;icons/sample2.gif&quot; class=&quot;example.ViewImpl&quot; id=&quot;example.view&quot; /> </extension> <extension point=&quot;org.eclipse.ui.views&quot;> <view name=&quot;Message&quot; allowMultiple=&quot;true&quot; icon=&quot;icons/sample2.gif&quot; class=&quot; org.ops4j.peaberry.eclipse.GuiceExtensionFactory : example.ViewImpl&quot; id=&quot;example.view&quot; /> </extension> <extension point=&quot;org.ops4j.peaberry.eclipse.modules&quot;> <module class=&quot;example.ViewModule&quot; /> </extension> GuiceExtensionFactory, similar approach as Spring becomes
Blending services and extensions binder.install(osgiModule(context, eclipseRegistry())); peaberry 1.1-rc2 lets you combine registries Clients can continue to use the same injection points @Inject StockQuote quote; YOU can choose where the service comes from or even whether to use a dynamic service at all ! service proxies will then query both OSGi and
Summary Guice can now be used in OSGi peaberry adds  dynamic   services to Guice model easy to switch between services and non-services can mix'n'match coming soon: lifecycles, configuration support ... like OSGi services and Eclipse extensions different service registries
Questions?

Contenu connexe

Tendances

computer notes - Data Structures - 18
computer notes - Data Structures - 18computer notes - Data Structures - 18
computer notes - Data Structures - 18
ecomputernotes
 

Tendances (20)

Full-Stack Reactive with Spring WebFlux + Angular - JConf Colombia 2019
Full-Stack Reactive with Spring WebFlux + Angular - JConf Colombia 2019Full-Stack Reactive with Spring WebFlux + Angular - JConf Colombia 2019
Full-Stack Reactive with Spring WebFlux + Angular - JConf Colombia 2019
 
Protocol in Swift
Protocol in SwiftProtocol in Swift
Protocol in Swift
 
Ngrx meta reducers
Ngrx meta reducersNgrx meta reducers
Ngrx meta reducers
 
Functional Javascript
Functional JavascriptFunctional Javascript
Functional Javascript
 
Angular2 + rxjs
Angular2 + rxjsAngular2 + rxjs
Angular2 + rxjs
 
Full-Stack Reactive with Spring WebFlux + Angular - Oracle Code One 2018
Full-Stack Reactive with Spring WebFlux + Angular - Oracle Code One 2018Full-Stack Reactive with Spring WebFlux + Angular - Oracle Code One 2018
Full-Stack Reactive with Spring WebFlux + Angular - Oracle Code One 2018
 
Computer notes - Reference Variables –II
Computer notes  - Reference Variables –IIComputer notes  - Reference Variables –II
Computer notes - Reference Variables –II
 
Full-Stack Reativo com Spring WebFlux + Angular - Devs Java Girl
Full-Stack Reativo com Spring WebFlux + Angular - Devs Java GirlFull-Stack Reativo com Spring WebFlux + Angular - Devs Java Girl
Full-Stack Reativo com Spring WebFlux + Angular - Devs Java Girl
 
computer notes - Data Structures - 18
computer notes - Data Structures - 18computer notes - Data Structures - 18
computer notes - Data Structures - 18
 
Functional Reactive Endpoints using Spring 5
Functional Reactive Endpoints using Spring 5Functional Reactive Endpoints using Spring 5
Functional Reactive Endpoints using Spring 5
 
Gerenciamento de estado no Angular com NgRx
Gerenciamento de estado no Angular com NgRxGerenciamento de estado no Angular com NgRx
Gerenciamento de estado no Angular com NgRx
 
06. operator overloading
06. operator overloading06. operator overloading
06. operator overloading
 
JavaScript Functions
JavaScript FunctionsJavaScript Functions
JavaScript Functions
 
Inline and lambda function
Inline and lambda functionInline and lambda function
Inline and lambda function
 
The Ring programming language version 1.5.2 book - Part 79 of 181
The Ring programming language version 1.5.2 book - Part 79 of 181The Ring programming language version 1.5.2 book - Part 79 of 181
The Ring programming language version 1.5.2 book - Part 79 of 181
 
Lecture5
Lecture5Lecture5
Lecture5
 
Capstone ms2
Capstone ms2Capstone ms2
Capstone ms2
 
Commit University - Exploring Angular 2
Commit University - Exploring Angular 2Commit University - Exploring Angular 2
Commit University - Exploring Angular 2
 
Mobile Fest 2018. Кирилл Розов. Insert Koin
Mobile Fest 2018. Кирилл Розов. Insert KoinMobile Fest 2018. Кирилл Розов. Insert Koin
Mobile Fest 2018. Кирилл Розов. Insert Koin
 
Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics
 

Similaire à Peaberry - Blending Services And Extensions

Working effectively with legacy code
Working effectively with legacy codeWorking effectively with legacy code
Working effectively with legacy code
ShriKant Vashishtha
 
Developing A Real World Logistic Application With Oracle Application - UKOUG ...
Developing A Real World Logistic Application With Oracle Application - UKOUG ...Developing A Real World Logistic Application With Oracle Application - UKOUG ...
Developing A Real World Logistic Application With Oracle Application - UKOUG ...
Roel Hartman
 
Introduction to Everit Component Registry - B Zsoldos
Introduction to Everit Component Registry - B ZsoldosIntroduction to Everit Component Registry - B Zsoldos
Introduction to Everit Component Registry - B Zsoldos
mfrancis
 
OpenSocial Intro
OpenSocial IntroOpenSocial Intro
OpenSocial Intro
Pamela Fox
 

Similaire à Peaberry - Blending Services And Extensions (20)

The Web on OSGi: Here's How
The Web on OSGi: Here's HowThe Web on OSGi: Here's How
The Web on OSGi: Here's How
 
Wcf data services
Wcf data servicesWcf data services
Wcf data services
 
Working effectively with legacy code
Working effectively with legacy codeWorking effectively with legacy code
Working effectively with legacy code
 
Intro to RX
Intro to RXIntro to RX
Intro to RX
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Data
 
GWT
GWTGWT
GWT
 
Gooogle Web Toolkit
Gooogle Web ToolkitGooogle Web Toolkit
Gooogle Web Toolkit
 
Interoperable Web Services with JAX-WS
Interoperable Web Services with JAX-WSInteroperable Web Services with JAX-WS
Interoperable Web Services with JAX-WS
 
Qt Workshop
Qt WorkshopQt Workshop
Qt Workshop
 
WCF - In a Week
WCF - In a WeekWCF - In a Week
WCF - In a Week
 
Javazone 2010-lift-framework-public
Javazone 2010-lift-framework-publicJavazone 2010-lift-framework-public
Javazone 2010-lift-framework-public
 
Developing A Real World Logistic Application With Oracle Application - UKOUG ...
Developing A Real World Logistic Application With Oracle Application - UKOUG ...Developing A Real World Logistic Application With Oracle Application - UKOUG ...
Developing A Real World Logistic Application With Oracle Application - UKOUG ...
 
AngularJS - Services
AngularJS - ServicesAngularJS - Services
AngularJS - Services
 
JSP diana y yo
JSP diana y yoJSP diana y yo
JSP diana y yo
 
Angular resolver tutorial
Angular resolver tutorialAngular resolver tutorial
Angular resolver tutorial
 
The battle of Protractor and Cypress - RunIT Conference 2019
The battle of Protractor and Cypress - RunIT Conference 2019The battle of Protractor and Cypress - RunIT Conference 2019
The battle of Protractor and Cypress - RunIT Conference 2019
 
Introduction to Everit Component Registry - B Zsoldos
Introduction to Everit Component Registry - B ZsoldosIntroduction to Everit Component Registry - B Zsoldos
Introduction to Everit Component Registry - B Zsoldos
 
OpenSocial Intro
OpenSocial IntroOpenSocial Intro
OpenSocial Intro
 
Building real-time collaborative apps with Ajax.org Platform
Building real-time collaborative apps with Ajax.org PlatformBuilding real-time collaborative apps with Ajax.org Platform
Building real-time collaborative apps with Ajax.org Platform
 
Google Web Toolkit
Google Web ToolkitGoogle Web Toolkit
Google Web Toolkit
 

Dernier

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Dernier (20)

Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

Peaberry - Blending Services And Extensions

  • 2. Today's menu Origin of peaberry OSGi-fying Guice Service providers Service registry abstraction Blending services & extensions Future ideas
  • 3. Origin Began as lab project at community site new annotations @Inject @OSGiService(&quot;(Currency=GBP)&quot;) StockQuote quote; patched Guice to support service “auto-binding” @OSGiService(...) StockQuote quote; // magically added for you bind(StockQuote.class)...
  • 4. Simplification Auto-binding introduced too much magic @Inject @OSGiService(&quot;(Currency=GBP)&quot;) StockQuote quote; NO new annotations service bindings now explicit, just like pure Guice aim to be a true extension to Guice – no patches! so...
  • 5. Squeezing Guice into a bundle Guice now has OSGi metadata thanks to Guice's type-safety meant no major classloading issues ... but AOP proxies initially didn't work in OSGi AOP proxies need to see client types AOP support types BND internal &
  • 6. Bridge class loader Don't want to expose AOP internals (repackaged CGLIB) parent parent com.google.inject.internal.* loadClass loadClass so load proxy classes using “bridge” class loaders
  • 7. Bridge class loader (2) No dependency on OSGi ! – only used when needed of bridge classloaders allows re-use ... as well as eager unloading of proxy classes BUT cannot apply bridging to package-private types as not visible from other classloaders weak cache
  • 8. Why peaberry? Guice can now be used in OSGi – so what's missing? no support for dynamic OSGi services! each injector uses immutable set of explicit bindings so ... new Injector on every service change? or ... Provider<T> that returns dynamic proxies? :( :)
  • 9. Service Provider @Inject StockQuote quote; quote.price(“JAVA”); get unget price injector get K P K P K P P Service Registry p r o x y p r o x y
  • 10. Service binding Fluent API helps you get the right service Provider<T> bind( iterable( A.class ) ).toProvider( service( A.class ).multiple() ); @Inject A bestService; @Inject Iterable<A> allServices; // each element is a proxy import static org.ops4j.peaberry.Peaberry.service; import static org.ops4j.peaberry.util.TypeLiterals.iterable; * bind( A.class ).toProvider( service( A.class ).single() );
  • 11. Service binding (2) So is that it? s:
  • 12. Service binding (2) So is that it? ... no, you can also service( A.class ).filter( /* apply a filter */ )... service( A.class ).in( /* query a specific registry */ )... service( A.class ).out( /* watch for service changes */ )... service( A.class ).decoratedWith( /* apply decoration */ )... each stage of the builder creates an immutable copy which means you can share and re-use builders
  • 13. Service Registry public interface ServiceRegistry { <T> Iterable<Import<T>> lookup(Class<T> clazz, AttributeFilter filter); <T> void watch(Class<T> clazz, AttributeFilter filter, ServiceWatcher<? super T> watcher); } public interface AttributeFilter { boolean matches(Map<String, ?> attributes); } Pluggable API – integrate all kinds of service registries simple, allows lazines s z z z , no dependency on OSGi service filters not just limited to LDAP strings but we do provide an LDAP adapter (among others)
  • 14. Import public interface Import<T> { T get(); // may throw unchecked ServiceUnavailableException Map <String, ?> attributes(); void unget(); boolean available(); } Tracking service use is very important ! public interface ImportDecorator<S> { <T extends S> Import<T> decorate(Import<T> service); } can easily apply deco to change dynamic behaviour (e.g. sticky services) ation to imported services
  • 15. Concurrent Import public synchronized T get() { count ++; if ( null == service ) { final Iterator<Import<T>> i = services .iterator(); if (i.hasNext()) { service = i.next(); instance = service .get(); } } return instance ; } public synchronized void unget() { if (0 == -- count && null != service ) { final Import<T> temp = service ; instance = null ; service = null ; temp.unget(); } } Single services wrap iterables to look like single imports avoids thread-locals, provides basic service affinity
  • 16. Export What's the opposite of a imported service? hint
  • 17. Export public interface Export<T> { void put(T instance); void attributes(Map<String, ?> attributes); void unput(); } Can alter/remove exported instance, update attributes public interface ServiceWatcher<S> { <T extends S> Export<T> add(Import<T> service); } watchers can receive imports and (re-)export them but wait, isn't a registry a bit like a watcher?
  • 18. Service Registry (revisited) public interface ServiceRegistry extends ServiceWatcher<Object> { // etc... public interface Export<T> extends Import<T> { // etc... which leads to interesting possibilities ... Yes, and exports are also related to imports // like pushing services from one registry to another for (Import<A> i : extensionRegistry.lookup(A.class, null)) { serviceRegistry.add(i); } but you don't have to use the raw API to export
  • 19. Service binding (revisited) Exported service handles can be injected bind( export( A.class ) ).toProvider( service( (A)null ).export() ); @Inject Export<A> exportedService; import static org.ops4j.peaberry.Peaberry.service; import static org.ops4j.peaberry.util.TypeLiterals.export; * bind( export( A.class ) ).toProvider( service( aImpl ).export() ); otherwise published when export handle is created can defer publishing a service by passing in null
  • 20. Eclipse extensions Eclipse has its own registry for plug-in this is like another service registry, but less dynamic extensions so ... how can we map the service class to an instance? take inspiration from Eclipse Riena, use bean mapping ! unless its a compatible executable extension OR we're looking up IconfigurationElement class
  • 21. Mapping extensions Use @MapName, @MapContent from peaberry or Riena Same approach as Riena for mapping bean types But use @ExtensionBean to configure point id @ExtensionBean(&quot;examples.menu.items&quot;) public interface Item { String getLabel(); @MapName(&quot;label&quot;) String toString(); @MapContent String getContent(); }
  • 22. Injecting extensions <extension point=&quot;org.eclipse.ui.views&quot;> <view name=&quot;Message&quot; allowMultiple=&quot;true&quot; icon=&quot;icons/sample2.gif&quot; class=&quot;example.ViewImpl&quot; id=&quot;example.view&quot; /> </extension> <extension point=&quot;org.eclipse.ui.views&quot;> <view name=&quot;Message&quot; allowMultiple=&quot;true&quot; icon=&quot;icons/sample2.gif&quot; class=&quot; org.ops4j.peaberry.eclipse.GuiceExtensionFactory : example.ViewImpl&quot; id=&quot;example.view&quot; /> </extension> <extension point=&quot;org.ops4j.peaberry.eclipse.modules&quot;> <module class=&quot;example.ViewModule&quot; /> </extension> GuiceExtensionFactory, similar approach as Spring becomes
  • 23. Blending services and extensions binder.install(osgiModule(context, eclipseRegistry())); peaberry 1.1-rc2 lets you combine registries Clients can continue to use the same injection points @Inject StockQuote quote; YOU can choose where the service comes from or even whether to use a dynamic service at all ! service proxies will then query both OSGi and
  • 24. Summary Guice can now be used in OSGi peaberry adds dynamic services to Guice model easy to switch between services and non-services can mix'n'match coming soon: lifecycles, configuration support ... like OSGi services and Eclipse extensions different service registries