SlideShare uma empresa Scribd logo
1 de 57
Baixar para ler offline
OSGi
Declarative Services versus
 Spring Dynamic Modules


                                                      Heiko Seeberger
                                                        WeigleWilczek
                                                             Kai Tödter
                                          Siemens Corporate Technology




                                                                  © Kai Tödter, Heiko Seeberger
        Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Agenda

» Demo: A Swing App Framework based dynamic OSGi application
» OSGi Services
      » Providing and consuming Services
      » Service Tracker
» Overview Declarative Services & Spring Dynamic Modules
» Declarative Services in Detail
» Spring Dynamic Modules in Detail
» Comparison (DS vs. DM)
» Conclusion & Best Practices
» Discussion



                                                                                         © Kai Tödter, Heiko Seeberger
  2                            Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Demo




                                                              © Kai Tödter, Heiko Seeberger
3   Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
How to get the Demo?

» The PM Demo project home page is:
  http://max-server.myftp.org/trac/pm
» There you find
      » Wiki with some documentation
      » Anonymous Subversion access
      » Trac issue tracking
» Licenses
      » All PM project sources are licensed under EPL
      » Swing Application Framework (JSR 296) implementation is licensed
        under LGPL
      » Swing Worker is licensed under LGPL
      » The nice icons from FamFamFam are licensed under the Creative
        Commons Attribution 2.5 License


                                                                                          © Kai Tödter, Heiko Seeberger
  4                             Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Agenda

» Demo: A Swing App Framework based dynamic OSGi application
» OSGi Services
      » Providing and consuming Services
      » Service Tracker
» Overview Declarative Services & Spring Dynamic Modules
» Declarative Services in Detail
» Spring Dynamic Modules in Detail
» Comparison (DS vs. DM)
» Conclusion & Best Practices
» Discussion



                                                                                         © Kai Tödter, Heiko Seeberger
  5                            Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
OSGi is Service-Oriented!




                                                                     © Kai Tödter, Heiko Seeberger
6          Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Providing a Service (1)



                                   Service
                                   Registry
    << register >>




     POJO


        << implement >>
                                    Service                  Service
                                   Interface                Properties




                                                                               © Kai Tödter, Heiko Seeberger
7                    Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Providing a Service (2)

» An OSGi service is a POJO ...
» ... registered under one ore more service interface names ...
» ... and optional service properties




                                BundleContext
      + registerService(String, Object, Dictionary): ServiceRegistration
      + registerService(String[], Object, Dictionary): ServiceRegistration




                                                                                          © Kai Tödter, Heiko Seeberger
  8                             Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Consuming a Service (1)




                             Service
                             Registry
                                                                  << look-up >>



                                                                           Service
    POJO
                                                                          Reference

      << implement >>
                               Service                 Service
                              Interface               Properties




                                                                                  © Kai Tödter, Heiko Seeberger
9                       Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Consuming a Service (2)

» First a service reference is looked-up by the Service Interface name
» Second the service object is obtained using the Service Reference
       » The Service Registry keeps track of obtained service objects
» When no longer needed, a service object must be returned




                                  BundleContext
                + getServiceReference(String): ServiceReference
                + getService(ServiceReference): Object
                + ungetService(ServiceReference): boolean




                                                                                            © Kai Tödter, Heiko Seeberger
  10                              Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
How to deal with Service Dynamics?




                                                                      © Kai Tödter, Heiko Seeberger
            Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Services might come and go

» Service Look-ups might fail, because ...
       » ... bundle(s) providing service not started yet
       » ... service(s) not registered yet
       » ... bundle(s) providing service stopped
       » ...




                                  Best practice:
           Better listen to service events than looking up services.




                                                                                              © Kai Tödter, Heiko Seeberger
  12                                Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Service Listeners ...

» ... will receive all service events
       » REGISTERED, MODIFIED, UNREGISTERING
» ... or a filtered subset

                               BundleContext
             + addServiceListener(ServiceListener): void
             + addServiceListener(ServiceListener, String): void




                                                                                         © Kai Tödter, Heiko Seeberger
  13                           Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Dynamic Services are difficult to handle (1)


                                  Typical task:
              Track all services of a certain type, i.e. all that are
              already there as well as all that will come and go.




» Possible solution:
       » (1) Frist look-up all existing services
       » (2) Then register a Service Listener to stay tuned
» Problem: Possibility to miss out on some services registered or
  unregistered between (1) and (2)




                                                                                              © Kai Tödter, Heiko Seeberger
  14                                Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Dynamic Services are difficult to handle (2)

» Alternative solution: Reverse the steps
       » (1) First register a Service Listener to stay tuned
       » (2) Then look-up all existing services
» Problem: Watch out for duplication!




                                Best practice:
        Service Listeners are low-level and their usage is error-prone.
                        Better use Service Trackers.




                                                                                             © Kai Tödter, Heiko Seeberger
  15                               Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
The Service Tracker

» Utility class specified in OSGi Service Compendium
       » Package: “org.osgi.util.tracker”
       » Based on Service Listeners and “a lot of knowledge”
» Services to be tracked may be specified by ...
       » ... a Service Interface name
       » ... a filter
» Must be opened to start and closed to stop tracking
» Handles service events via the methods
       » addingService()
       » modifiedService()
       » removedService()




                                                                                             © Kai Tödter, Heiko Seeberger
  16                               Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Services in very dynamic Scenarios

» Programmatic use of dynamic services works, but has some
  drawbacks:
       » Eager creation of services leads to
           » Large memory footprint
           » Long startup time
       » Increasing complexity with decreasing robustness


» But is there anything out there that helps here?
» Yes, services and dependencies can be specified declaratively!
       » Declarative Services
       » Spring Dynamic Modules
       » Others (e.g. iPOJO)



                                                                                                © Kai Tödter, Heiko Seeberger
  17                                  Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Agenda

» Demo: A Swing App Framework based dynamic OSGi application
» OSGi Services
       » Providing and consuming Services
       » Service Tracker
» Overview Declarative Services & Spring Dynamic Modules
» Declarative Services in Detail
» Spring Dynamic Modules in Detail
» Comparison (DS vs. DM)
» Conclusion & Best Practices
» Discussion



                                                                                          © Kai Tödter, Heiko Seeberger
  18                            Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Overview DS & DM

» The next 4 slides show just a very brief overview and examples
» Details follow in the rest of this presentation




                                                                                        © Kai Tödter, Heiko Seeberger
  19                          Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Declarative Services (DS)

» DS is part of the OSGi R4 spec (Service Compendium)
» DS let you declare components in XML
» The declarations live in OSGI-INF/<component>.xml
» Components can provide services
» Components can depend on other services
       » Dependency injection for references to other services:
       » References may be bound to bind()-/unbind()-methods in components
       » A cardinality and a creation policy can be defined
» Components need the bundle manifest header Service-Component
  e.g. Service-Component: OSGI-INF/personManager.xml




                                                                                             © Kai Tödter, Heiko Seeberger
  20                               Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
PM Example DS Component

<component name=quot;pm.ui.actions.person.ActionContributionquot;>
      <implementation
          class=quot;pm.ui.actions.person.ActionContributionquot;/>
      <service>
         <provide interface=
               quot;pm.application.service.IActionContributionquot;/>
      </service>
      <reference name=quot;PersonManagerquot;
          interface=quot;pm.model.IPersonManagerquot;
          bind=quot;setPersonManagerquot;
          unbind=quot;removePersonManagerquot;
          cardinality=quot;0..1quot;
          policy=quot;dynamicquot;/>
</component>


                                                                                     © Kai Tödter, Heiko Seeberger
 21                        Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Spring Dynamic Modules (DM)

» Integration of Spring DI and OSGi
» XML files are placed in META-INF/spring directory, usually
       » One XML file to define a Spring bean
       » One XML file to map this bean to an OSGi service
» Uses Spring dependency injection for references to other services
  and POJOs
» Similar but more flexible/powerful approach compared with DS
       » But needs around 12 additional Spring and logging bundles to run




                                                                                           © Kai Tödter, Heiko Seeberger
  22                             Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
PM Example Spring DM Component

XML for Spring Bean:
<beans (schema attributes omitted)>
  <bean name=quot;savePersonquot;
         class=quot;pm.ui.actions.save.ActionContributionquot;/>
</beans>


XML for OSGi service mapping:
<beans (schema attributes omitted)>
<osgi:service id=quot;savePersonOSGiquot; ref=quot;savePersonquot;
   interface=quot;pm.application.service.IActionContributionquot;/>
</beans>



                                                                                    © Kai Tödter, Heiko Seeberger
  23                      Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Agenda

» Demo: A Swing App Framework based dynamic OSGi application
» OSGi Services
       » Providing and consuming Services
       » Service Tracker
» Overview Declarative Services & Spring Dynamic Modules
» Declarative Services in Detail
» Spring Dynamic Modules in Detail
» Comparison (DS vs. DM)
» Conclusion & Best Practices
» Discussion



                                                                                          © Kai Tödter, Heiko Seeberger
  24                            Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Service Component Runtime

» Providing a service means
      1. Providing an implementation of a service interface
      2. Register the implementation with the service registry
» In programmatic approaches, this is usually done by the same
  bundle
» In DS, the Service Component Runtime (SCR) takes care of
      » Registering/Unregistering the service implementation
      » Managing the lifecycle
» DS introduces the notion of a Component that
      » Can provide services
      » Can depend on other services




                                                                                            © Kai Tödter, Heiko Seeberger
 25                               Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Needed OSGi Bundles

To run DS with Equinox, the following bundles are needed:


» org.eclipse.osgi
» org.eclipse.osgi.services
» org.eclipse.equinox.ds
» org.eclipse.equinox.util




                                                                                        © Kai Tödter, Heiko Seeberger
  26                          Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
DS Components


                   Provides Services
     optional


     Component
                                                         Component
     Description
                                                          Instance
       (XML)
                                                           (POJO)


       optional
                       Depends on
                    Service References


                                                                               © Kai Tödter, Heiko Seeberger
27                   Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Component Activation

» Lazy Activation (Delayed Component)
      » All dependencies must be resolved
      » On first request of the service interface the component is activated
      » This is the default behavior for components providing services
» Eager Activation (Immediate Component):
      » As all dependencies can be resolved the component is created
      » This is expressed in XML by the component attribute
        immediate=quot;truequot;
      » This should be used only if there is a good reason for!
      » All components not providing services must be immediate components!




                                                                                            © Kai Tödter, Heiko Seeberger
 28                               Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Component Activation (1)




                     Create
     Load          Component
                                                Bind target                        Call activate()
                  Instance and
  Component
                                                 services                            if present
                   Component
Instance class
                     Context




                                                                                    © Kai Tödter, Heiko Seeberger
29                        Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Component Activation (2)

» Component Instance class needs a default constructor
» activate() and deactivate() may be supplied
       » Methods are found by reflection
       » May also be defined in super classes

       protected void activate(ComponentContext context)
       protected void deactivate(ComponentContext context)




                                                                                           © Kai Tödter, Heiko Seeberger
  30                             Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Defining a DS Component

» The <component>.xml file
      » Has to be placed in a directory OSGI-INF
      » Contains the XML code
        <component name=quot;ct...person.ActionContributionquot;>
           <implementation
                 class=quot;ct...person.ActionContributionquot;/>
        </component>
      » Optional component attributes
         » immediate: if set true, the component is activated eagerly
      » Optional tags (see next slides)
          » service
          » reference

» Components need the bundle manifest header Service-Component
  e.g. Service-Component: OSGI-INF/<component>.xml


                                                                                            © Kai Tödter, Heiko Seeberger
 31                               Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Services and Properties

» Specify the interface the component implements as a service, e.g.
       <service>
          <provide interface=
             quot;pm.application.service.IActionContributionquot;/>
       </service>


» Also properties can be defined declaratively, e.g.
   <property name=quot;action.namequot;
                   type=quot;Stringquot; value=quot;SavePersonActionquot;/>


» The defined service will have the component’s properties




                                                                                          © Kai Tödter, Heiko Seeberger
  32                            Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Defining References

» DS uses dependency injection for references to other services
» The SCR resolves all the references automatically
       » Only, if all references with respect to the cardinality (see next slide) can
         be resolved, the component will be activated


         <reference name=quot;PersonManagerquot;
              interface=quot;pm.model.IPersonManager“
              ...
         />




                                                                                              © Kai Tödter, Heiko Seeberger
  33                                Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Reference Cardinality


Cardinality        Meaning
                   Unary and optional
0..1
1..1               Unary and mandatory
0..n               Multiple and optional
1..n               Multiple and mandatory

Example

<reference name=quot;PersonManagerquot;
     ...
     cardinality=quot;0..1quot;
/>




                                                                                 © Kai Tödter, Heiko Seeberger
 34                    Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Accessing Services – Event Strategy

» On (un)binding a referenced service a (un)bind method is called
» Methods are found by reflection
» Method names are specified in XML
       <reference name=quot;PersonManagerquot;
             ...
             bind=quot;setPersonManagerquot;
             unbind=quot;removePersonManagerquot;
             …
       />
» Parameters for bind/unbind method may be the service type or a
  ServiceReference, e.g.
            public synchronized void
                  setPersonManager(IPersonManager personManager)


                                                                                        © Kai Tödter, Heiko Seeberger
  35                          Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Reference Policy

» How does unbinding of target services influence the life cycle?
» Static policy:
       » Service Component is deactivated and ...
       » ... activated again if other service(s) available
» Dynamic policy:
       » Life cycle is not affected, as long as references are satisfied
          <reference name=quot;PersonManagerquot;
             …
             policy=quot;dynamicquot;/>




                                                                                              © Kai Tödter, Heiko Seeberger
  36                                Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
DS Conclusion

+ Very easy to define components, services and references
  declaratively
+ SCR takes care of life cycle management and dependency
  resolution


But
 Dependency injection only works for other services, not for POJOs
  or DS components
 Properties cannot be declared mandatory




                                                                                      © Kai Tödter, Heiko Seeberger
  37                        Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Agenda

» Demo: A Swing App Framework based dynamic OSGi application
» OSGi Services
       » Providing and consuming Services
       » Service Tracker
» Overview Declarative Services & Spring Dynamic Modules
» Declarative Services in Detail
» Spring Dynamic Modules in Detail
» Comparison (DS vs. DM)
» Conclusion & Best Practices
» Discussion



                                                                                          © Kai Tödter, Heiko Seeberger
  38                            Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Spring Dependency Injection

» Application Context: Lightweight container
» Beans: Non-invasive programming model
» Dependency Injection




                                                                                      © Kai Tödter, Heiko Seeberger
  39                        Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
What is Spring DM?




     Spring Dynamic Modules focuses on integrating Spring
     Framework powerful, non-invasive programming model and
     concepts with the dynamics and modularity of OSGi platform.

     It allows transparent exporting and importing of OSGi
     services, life cycle management and control.

     (Spring DM Ref. Guide, 1.0)




                                                                                       © Kai Tödter, Heiko Seeberger
40                           Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Spring DM at a Glance




                                                                     © Kai Tödter, Heiko Seeberger
41         Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Applying the Extender Model




                                                                        © Kai Tödter, Heiko Seeberger
42            Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
The Spring-Context Manifest Header




                                                                           © Kai Tödter, Heiko Seeberger
43               Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Application Context Creation


       Directive                                           Effect
create-asynchronously   Create asynchronously as to OSGi thread?
                        Default is true
wait-for-dependencies   Wait for mandatory dependencies?
                        Default is true
timeout                 Time in seconds to wait for mandatory
                        dependencies before failing.
                        Default is 300
publish-context         Publish the Application Context as OSGi
                        service?
                        Default is true




                                                                                    © Kai Tödter, Heiko Seeberger
 44                       Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Exporting Beans as OSGi Services (1)




        <service ref=quot;...quot; interface=quot;...quot;>




                                                                              © Kai Tödter, Heiko Seeberger
45                  Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Exporting Beans as OSGi Services (2)


  service Attributes                                   Meaning
ref                    Bean to be exported as OSGi service
interface              FQCN of service interface.
                       Alternatives: auto-export or interfaces sub-
                       element
auto-export            Automatically manage service interfaces.
                       disabled, interfaces, class-hierarchy,
                       all-classes
ranking                Service property service.ranking




                                                                                   © Kai Tödter, Heiko Seeberger
 46                      Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Importing Beans as OSGi Services (1)




<reference id=quot;...quot; interface=quot;...quot; cardinality=quot;...quot;>

 <set|list id=quot;...quot; interface=quot;...quot; cardinality=quot;...quot;>



                                                                                © Kai Tödter, Heiko Seeberger
47                    Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Importing Beans as OSGi Services (2)


         Attributes                                   Meaning
id                    Name of bean for referenced OSGi service
interface             FQCN of service interface.
                      Alternative: interfaces sub-element
filter                OSGi filter expression to constrain service
                      look-up
cardinality           reference: 0..1, 1..1
                      set|list: 0..N, 1..N




                                                                                  © Kai Tödter, Heiko Seeberger
  48                    Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
And what about Service Dynamics?

» ServiceUnavailableException for invocations on stale references
» Unary references (reference) are dynamic-aware
       » Re-binding with matching service when bound service goes away
» Multiple references (set|list) are dynamic-aware
       » Collections and Iterators always up-to-date with service registry


» Services with unsatisfied references are unregistered …
» … and re-registered when satisfied again




                                                                                             © Kai Tödter, Heiko Seeberger
  49                               Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Listening to Service Events




     <reference id=quot;...quot; interface=quot;...quot;>
       <listener bind-method=quot;...quot; unbind-method=quot;...quot;>
         <beans:bean class=quot;...quot;/>
         ...

                                                                                   © Kai Tödter, Heiko Seeberger
50                       Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Needed OSGi Bundles

To run Spring DM the following additional bundles are needed:
» spring-osgi-core-1.1.2.jar
» spring-osgi-extender-1.1.2.jar
» spring-osgi-io-1.1.2.jar
» com.springsource.org.aopalliance-1.0.0.jar
» spring-aop-2.5.5.jar
» spring-beans-2.5.5.jar
» spring-context-2.5.5.jar
» spring-core-2.5.5.jar
» com.springsource.slf4j.api-1.5.0.jar
» com.springsource.slf4j.log4j-1.5.0.jar
» com.springsource.slf4j.org.apache.commons.logging-1.5.0.jar
» log4j.osgi-1.2.15-SNAPSHOT.jar

                                                                                         © Kai Tödter, Heiko Seeberger
  51                           Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Spring DM Conclusion

+ Very easy to define Spring beans, OSGi services and references
  declaratively
+ Spring DM takes care of life cycle management and dependency
  resolution
+ Very powerful Dependency Injection


But
 Properties also cannot be declared mandatory




                                                                                     © Kai Tödter, Heiko Seeberger
  52                       Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Agenda

» Demo: A Swing App Framework based dynamic OSGi application
» OSGi Services
       » Providing and consuming Services
       » Service Tracker
» Overview Declarative Services & Spring Dynamic Modules
» Declarative Services in Detail
» Spring Dynamic Modules in Detail
» Comparison (DS vs. DM)
» Conclusion & Best Practices
» Discussion



                                                                                          © Kai Tödter, Heiko Seeberger
  53                            Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
DS versus DM

Topic                                                                 OSGi DS                   Spring DM
Ease of use                                                           ++                        +
Reducing complexity                                                   +                         ++
Lazy service activation/creation                                      ++                        --
Compatible with procedural OSGi service model                         ++                        ++
Dependency Injection of Services                                      +                         +
Dependency Injection of POJOs                                         --                        ++
Current tooling support                                               +                         +




                                                                                             © Kai Tödter, Heiko Seeberger
  54                               Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Conclusion & Recommendation

» We recommend to use either DS or DM rather than manually
  programming all the service infrastructure and life cycles
» If the capabilities of DS are ok with you (or lazy activation is
  important), use DS
» If you need DI or want to use Spring anyway, use Spring DM




                                                                                        © Kai Tödter, Heiko Seeberger
  55                          Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Further Information

» OSGi Alliance Specifications: Service Compendium,
     112 Declarative Services Specification
       » Component Description schema detailed
       » Enabling Service Components
       » Factory Components
» Spring Dynamic Modules
» Other Service Component models
       » Apache Felix iPOJO




                                                                                          © Kai Tödter, Heiko Seeberger
  56                            Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
Discussion




                                                               © Kai Tödter, Heiko Seeberger
57   Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License

Mais conteúdo relacionado

Semelhante a OSGi Declarative Services vs Spring Dynamic Modules

Making sense of your Microsoft Cloud licenses part 2
Making sense of your Microsoft Cloud licenses part 2 Making sense of your Microsoft Cloud licenses part 2
Making sense of your Microsoft Cloud licenses part 2 TechSoup
 
Case StudyAugust 2010Case Study Using ITIL® and PRIN
Case StudyAugust 2010Case Study Using ITIL® and  PRINCase StudyAugust 2010Case Study Using ITIL® and  PRIN
Case StudyAugust 2010Case Study Using ITIL® and PRINMaximaSheffield592
 
Build Smart Service on GCP - Google DevFest 2018 Taiwan
Build Smart Service on GCP - Google DevFest 2018 TaiwanBuild Smart Service on GCP - Google DevFest 2018 Taiwan
Build Smart Service on GCP - Google DevFest 2018 TaiwanDavid Chen
 
Introducing Zeebe.io at Camunda Meetup Vienna 10/2017
Introducing Zeebe.io at Camunda Meetup Vienna 10/2017Introducing Zeebe.io at Camunda Meetup Vienna 10/2017
Introducing Zeebe.io at Camunda Meetup Vienna 10/2017Daniel Meyer
 
How to Avoid Kubernetes Multi-tenancy Catastrophes
How to Avoid Kubernetes Multi-tenancy CatastrophesHow to Avoid Kubernetes Multi-tenancy Catastrophes
How to Avoid Kubernetes Multi-tenancy CatastrophesWeaveworks
 
Building Stateful applications on Streaming Platforms | Premjit Mishra, Dell ...
Building Stateful applications on Streaming Platforms | Premjit Mishra, Dell ...Building Stateful applications on Streaming Platforms | Premjit Mishra, Dell ...
Building Stateful applications on Streaming Platforms | Premjit Mishra, Dell ...HostedbyConfluent
 
Arnaud Simon Service Contract Template
Arnaud  Simon    Service  Contract  TemplateArnaud  Simon    Service  Contract  Template
Arnaud Simon Service Contract TemplateSOA Symposium
 
Test expo cloud-enabled testing services (wide)_v1.0
Test expo cloud-enabled testing services (wide)_v1.0Test expo cloud-enabled testing services (wide)_v1.0
Test expo cloud-enabled testing services (wide)_v1.0Ewald Roodenrijs
 
2022 APIsecure_Why Assertion-based Access Token is preferred to Handle-based ...
2022 APIsecure_Why Assertion-based Access Token is preferred to Handle-based ...2022 APIsecure_Why Assertion-based Access Token is preferred to Handle-based ...
2022 APIsecure_Why Assertion-based Access Token is preferred to Handle-based ...APIsecure_ Official
 
Why Assertion-based Access Token is preferred to Handle-based one?
Why Assertion-based Access Token is preferred to Handle-based one?Why Assertion-based Access Token is preferred to Handle-based one?
Why Assertion-based Access Token is preferred to Handle-based one?Hitachi, Ltd. OSS Solution Center.
 
Cut Through Cloud Clutter: Insights from Visible Ops Private Cloud
Cut Through Cloud Clutter: Insights from Visible Ops Private CloudCut Through Cloud Clutter: Insights from Visible Ops Private Cloud
Cut Through Cloud Clutter: Insights from Visible Ops Private CloudFlexera
 
JavaOne 2015: Scaling micro services at Gilt
JavaOne 2015: Scaling micro services at GiltJavaOne 2015: Scaling micro services at Gilt
JavaOne 2015: Scaling micro services at GiltAdrian Trenaman
 
Hyperledger Fabric - Blockchain for the Enterprise - FOSDEM 20190203
Hyperledger Fabric - Blockchain for the Enterprise - FOSDEM 20190203Hyperledger Fabric - Blockchain for the Enterprise - FOSDEM 20190203
Hyperledger Fabric - Blockchain for the Enterprise - FOSDEM 20190203Arnaud Le Hors
 
Whats Next for OSGi? - BJ Hargrave
Whats Next for OSGi? - BJ HargraveWhats Next for OSGi? - BJ Hargrave
Whats Next for OSGi? - BJ Hargravemfrancis
 
Loggly - Tools and Techniques For Logging Microservices
Loggly - Tools and Techniques For Logging MicroservicesLoggly - Tools and Techniques For Logging Microservices
Loggly - Tools and Techniques For Logging MicroservicesSolarWinds Loggly
 
Embracing Serverless: reengineering a real-estate digital marketplace
Embracing Serverless: reengineering a real-estate digital marketplaceEmbracing Serverless: reengineering a real-estate digital marketplace
Embracing Serverless: reengineering a real-estate digital marketplaceBATbern
 
Eci Service Architecture Evolution 1
Eci Service Architecture Evolution 1Eci Service Architecture Evolution 1
Eci Service Architecture Evolution 1David Sprott
 
Advance Serverless for Production Grade Workloads
Advance Serverless for Production Grade WorkloadsAdvance Serverless for Production Grade Workloads
Advance Serverless for Production Grade WorkloadsGary Arora
 
Rundeck Overview
Rundeck OverviewRundeck Overview
Rundeck OverviewRundeck
 
Sukumar Nayak-Agile-DevOps-Cloud Management
Sukumar Nayak-Agile-DevOps-Cloud ManagementSukumar Nayak-Agile-DevOps-Cloud Management
Sukumar Nayak-Agile-DevOps-Cloud ManagementSukumar Nayak
 

Semelhante a OSGi Declarative Services vs Spring Dynamic Modules (20)

Making sense of your Microsoft Cloud licenses part 2
Making sense of your Microsoft Cloud licenses part 2 Making sense of your Microsoft Cloud licenses part 2
Making sense of your Microsoft Cloud licenses part 2
 
Case StudyAugust 2010Case Study Using ITIL® and PRIN
Case StudyAugust 2010Case Study Using ITIL® and  PRINCase StudyAugust 2010Case Study Using ITIL® and  PRIN
Case StudyAugust 2010Case Study Using ITIL® and PRIN
 
Build Smart Service on GCP - Google DevFest 2018 Taiwan
Build Smart Service on GCP - Google DevFest 2018 TaiwanBuild Smart Service on GCP - Google DevFest 2018 Taiwan
Build Smart Service on GCP - Google DevFest 2018 Taiwan
 
Introducing Zeebe.io at Camunda Meetup Vienna 10/2017
Introducing Zeebe.io at Camunda Meetup Vienna 10/2017Introducing Zeebe.io at Camunda Meetup Vienna 10/2017
Introducing Zeebe.io at Camunda Meetup Vienna 10/2017
 
How to Avoid Kubernetes Multi-tenancy Catastrophes
How to Avoid Kubernetes Multi-tenancy CatastrophesHow to Avoid Kubernetes Multi-tenancy Catastrophes
How to Avoid Kubernetes Multi-tenancy Catastrophes
 
Building Stateful applications on Streaming Platforms | Premjit Mishra, Dell ...
Building Stateful applications on Streaming Platforms | Premjit Mishra, Dell ...Building Stateful applications on Streaming Platforms | Premjit Mishra, Dell ...
Building Stateful applications on Streaming Platforms | Premjit Mishra, Dell ...
 
Arnaud Simon Service Contract Template
Arnaud  Simon    Service  Contract  TemplateArnaud  Simon    Service  Contract  Template
Arnaud Simon Service Contract Template
 
Test expo cloud-enabled testing services (wide)_v1.0
Test expo cloud-enabled testing services (wide)_v1.0Test expo cloud-enabled testing services (wide)_v1.0
Test expo cloud-enabled testing services (wide)_v1.0
 
2022 APIsecure_Why Assertion-based Access Token is preferred to Handle-based ...
2022 APIsecure_Why Assertion-based Access Token is preferred to Handle-based ...2022 APIsecure_Why Assertion-based Access Token is preferred to Handle-based ...
2022 APIsecure_Why Assertion-based Access Token is preferred to Handle-based ...
 
Why Assertion-based Access Token is preferred to Handle-based one?
Why Assertion-based Access Token is preferred to Handle-based one?Why Assertion-based Access Token is preferred to Handle-based one?
Why Assertion-based Access Token is preferred to Handle-based one?
 
Cut Through Cloud Clutter: Insights from Visible Ops Private Cloud
Cut Through Cloud Clutter: Insights from Visible Ops Private CloudCut Through Cloud Clutter: Insights from Visible Ops Private Cloud
Cut Through Cloud Clutter: Insights from Visible Ops Private Cloud
 
JavaOne 2015: Scaling micro services at Gilt
JavaOne 2015: Scaling micro services at GiltJavaOne 2015: Scaling micro services at Gilt
JavaOne 2015: Scaling micro services at Gilt
 
Hyperledger Fabric - Blockchain for the Enterprise - FOSDEM 20190203
Hyperledger Fabric - Blockchain for the Enterprise - FOSDEM 20190203Hyperledger Fabric - Blockchain for the Enterprise - FOSDEM 20190203
Hyperledger Fabric - Blockchain for the Enterprise - FOSDEM 20190203
 
Whats Next for OSGi? - BJ Hargrave
Whats Next for OSGi? - BJ HargraveWhats Next for OSGi? - BJ Hargrave
Whats Next for OSGi? - BJ Hargrave
 
Loggly - Tools and Techniques For Logging Microservices
Loggly - Tools and Techniques For Logging MicroservicesLoggly - Tools and Techniques For Logging Microservices
Loggly - Tools and Techniques For Logging Microservices
 
Embracing Serverless: reengineering a real-estate digital marketplace
Embracing Serverless: reengineering a real-estate digital marketplaceEmbracing Serverless: reengineering a real-estate digital marketplace
Embracing Serverless: reengineering a real-estate digital marketplace
 
Eci Service Architecture Evolution 1
Eci Service Architecture Evolution 1Eci Service Architecture Evolution 1
Eci Service Architecture Evolution 1
 
Advance Serverless for Production Grade Workloads
Advance Serverless for Production Grade WorkloadsAdvance Serverless for Production Grade Workloads
Advance Serverless for Production Grade Workloads
 
Rundeck Overview
Rundeck OverviewRundeck Overview
Rundeck Overview
 
Sukumar Nayak-Agile-DevOps-Cloud Management
Sukumar Nayak-Agile-DevOps-Cloud ManagementSukumar Nayak-Agile-DevOps-Cloud Management
Sukumar Nayak-Agile-DevOps-Cloud Management
 

Mais de Heiko Seeberger

Scaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of ScalazScaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of ScalazHeiko Seeberger
 
RheinJUG 2010 - Sprechen Sie Scala?
RheinJUG 2010 - Sprechen Sie Scala?RheinJUG 2010 - Sprechen Sie Scala?
RheinJUG 2010 - Sprechen Sie Scala?Heiko Seeberger
 
JM 08/09 - Beginning Scala Review
JM 08/09 - Beginning Scala ReviewJM 08/09 - Beginning Scala Review
JM 08/09 - Beginning Scala ReviewHeiko Seeberger
 
OSGi DevCon Europe 09 - OSGi on Scala
OSGi DevCon Europe 09 - OSGi on ScalaOSGi DevCon Europe 09 - OSGi on Scala
OSGi DevCon Europe 09 - OSGi on ScalaHeiko Seeberger
 
Eclipse Magazin 12 - Design by Contract
Eclipse Magazin 12 - Design by ContractEclipse Magazin 12 - Design by Contract
Eclipse Magazin 12 - Design by ContractHeiko Seeberger
 
Eclipse Magazin 16 - Die Stärke der Drei
Eclipse Magazin 16 - Die Stärke der DreiEclipse Magazin 16 - Die Stärke der Drei
Eclipse Magazin 16 - Die Stärke der DreiHeiko Seeberger
 
Eclipse Magazin15 - Performance Logging
Eclipse Magazin15 - Performance LoggingEclipse Magazin15 - Performance Logging
Eclipse Magazin15 - Performance LoggingHeiko Seeberger
 
Eclipse Magazin 14 - Getting hooked on Equinox
Eclipse Magazin 14 - Getting hooked on EquinoxEclipse Magazin 14 - Getting hooked on Equinox
Eclipse Magazin 14 - Getting hooked on EquinoxHeiko Seeberger
 
Eclipse Magazin 12 - Security does matter
Eclipse Magazin 12 - Security does matterEclipse Magazin 12 - Security does matter
Eclipse Magazin 12 - Security does matterHeiko Seeberger
 
EclipseCon 08 - Agile RCP
EclipseCon 08 - Agile RCPEclipseCon 08 - Agile RCP
EclipseCon 08 - Agile RCPHeiko Seeberger
 

Mais de Heiko Seeberger (20)

Scaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of ScalazScaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of Scalaz
 
Java Magazin - Lift
Java Magazin - LiftJava Magazin - Lift
Java Magazin - Lift
 
JavaSPEKTRUM - Scala 3
JavaSPEKTRUM - Scala 3JavaSPEKTRUM - Scala 3
JavaSPEKTRUM - Scala 3
 
JavaSPEKTRUM - Scala 2
JavaSPEKTRUM - Scala 2JavaSPEKTRUM - Scala 2
JavaSPEKTRUM - Scala 2
 
JavaSPEKTRUM - Scala 1
JavaSPEKTRUM - Scala 1JavaSPEKTRUM - Scala 1
JavaSPEKTRUM - Scala 1
 
RheinJUG 2010 - Sprechen Sie Scala?
RheinJUG 2010 - Sprechen Sie Scala?RheinJUG 2010 - Sprechen Sie Scala?
RheinJUG 2010 - Sprechen Sie Scala?
 
W-JAX 09 - ScalaModules
W-JAX 09 - ScalaModulesW-JAX 09 - ScalaModules
W-JAX 09 - ScalaModules
 
W-JAX 09 - Lift
W-JAX 09 - LiftW-JAX 09 - Lift
W-JAX 09 - Lift
 
JM 08/09 - Beginning Scala Review
JM 08/09 - Beginning Scala ReviewJM 08/09 - Beginning Scala Review
JM 08/09 - Beginning Scala Review
 
JM 08/09 - ScalaModules
JM 08/09 - ScalaModulesJM 08/09 - ScalaModules
JM 08/09 - ScalaModules
 
OSGi DevCon Europe 09 - OSGi on Scala
OSGi DevCon Europe 09 - OSGi on ScalaOSGi DevCon Europe 09 - OSGi on Scala
OSGi DevCon Europe 09 - OSGi on Scala
 
JAX 09 - OSGi on Scala
JAX 09 - OSGi on ScalaJAX 09 - OSGi on Scala
JAX 09 - OSGi on Scala
 
JAX 08 - Agile RCP
JAX 08 - Agile RCPJAX 08 - Agile RCP
JAX 08 - Agile RCP
 
Eclipse Magazin 12 - Design by Contract
Eclipse Magazin 12 - Design by ContractEclipse Magazin 12 - Design by Contract
Eclipse Magazin 12 - Design by Contract
 
JUGM 07 - AspectJ
JUGM 07 - AspectJJUGM 07 - AspectJ
JUGM 07 - AspectJ
 
Eclipse Magazin 16 - Die Stärke der Drei
Eclipse Magazin 16 - Die Stärke der DreiEclipse Magazin 16 - Die Stärke der Drei
Eclipse Magazin 16 - Die Stärke der Drei
 
Eclipse Magazin15 - Performance Logging
Eclipse Magazin15 - Performance LoggingEclipse Magazin15 - Performance Logging
Eclipse Magazin15 - Performance Logging
 
Eclipse Magazin 14 - Getting hooked on Equinox
Eclipse Magazin 14 - Getting hooked on EquinoxEclipse Magazin 14 - Getting hooked on Equinox
Eclipse Magazin 14 - Getting hooked on Equinox
 
Eclipse Magazin 12 - Security does matter
Eclipse Magazin 12 - Security does matterEclipse Magazin 12 - Security does matter
Eclipse Magazin 12 - Security does matter
 
EclipseCon 08 - Agile RCP
EclipseCon 08 - Agile RCPEclipseCon 08 - Agile RCP
EclipseCon 08 - Agile RCP
 

Último

Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 

Último (20)

Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 

OSGi Declarative Services vs Spring Dynamic Modules

  • 1. OSGi Declarative Services versus Spring Dynamic Modules Heiko Seeberger WeigleWilczek Kai Tödter Siemens Corporate Technology © Kai Tödter, Heiko Seeberger Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 2. Agenda » Demo: A Swing App Framework based dynamic OSGi application » OSGi Services » Providing and consuming Services » Service Tracker » Overview Declarative Services & Spring Dynamic Modules » Declarative Services in Detail » Spring Dynamic Modules in Detail » Comparison (DS vs. DM) » Conclusion & Best Practices » Discussion © Kai Tödter, Heiko Seeberger 2 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 3. Demo © Kai Tödter, Heiko Seeberger 3 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 4. How to get the Demo? » The PM Demo project home page is: http://max-server.myftp.org/trac/pm » There you find » Wiki with some documentation » Anonymous Subversion access » Trac issue tracking » Licenses » All PM project sources are licensed under EPL » Swing Application Framework (JSR 296) implementation is licensed under LGPL » Swing Worker is licensed under LGPL » The nice icons from FamFamFam are licensed under the Creative Commons Attribution 2.5 License © Kai Tödter, Heiko Seeberger 4 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 5. Agenda » Demo: A Swing App Framework based dynamic OSGi application » OSGi Services » Providing and consuming Services » Service Tracker » Overview Declarative Services & Spring Dynamic Modules » Declarative Services in Detail » Spring Dynamic Modules in Detail » Comparison (DS vs. DM) » Conclusion & Best Practices » Discussion © Kai Tödter, Heiko Seeberger 5 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 6. OSGi is Service-Oriented! © Kai Tödter, Heiko Seeberger 6 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 7. Providing a Service (1) Service Registry << register >> POJO << implement >> Service Service Interface Properties © Kai Tödter, Heiko Seeberger 7 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 8. Providing a Service (2) » An OSGi service is a POJO ... » ... registered under one ore more service interface names ... » ... and optional service properties BundleContext + registerService(String, Object, Dictionary): ServiceRegistration + registerService(String[], Object, Dictionary): ServiceRegistration © Kai Tödter, Heiko Seeberger 8 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 9. Consuming a Service (1) Service Registry << look-up >> Service POJO Reference << implement >> Service Service Interface Properties © Kai Tödter, Heiko Seeberger 9 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 10. Consuming a Service (2) » First a service reference is looked-up by the Service Interface name » Second the service object is obtained using the Service Reference » The Service Registry keeps track of obtained service objects » When no longer needed, a service object must be returned BundleContext + getServiceReference(String): ServiceReference + getService(ServiceReference): Object + ungetService(ServiceReference): boolean © Kai Tödter, Heiko Seeberger 10 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 11. How to deal with Service Dynamics? © Kai Tödter, Heiko Seeberger Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 12. Services might come and go » Service Look-ups might fail, because ... » ... bundle(s) providing service not started yet » ... service(s) not registered yet » ... bundle(s) providing service stopped » ... Best practice: Better listen to service events than looking up services. © Kai Tödter, Heiko Seeberger 12 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 13. Service Listeners ... » ... will receive all service events » REGISTERED, MODIFIED, UNREGISTERING » ... or a filtered subset BundleContext + addServiceListener(ServiceListener): void + addServiceListener(ServiceListener, String): void © Kai Tödter, Heiko Seeberger 13 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 14. Dynamic Services are difficult to handle (1) Typical task: Track all services of a certain type, i.e. all that are already there as well as all that will come and go. » Possible solution: » (1) Frist look-up all existing services » (2) Then register a Service Listener to stay tuned » Problem: Possibility to miss out on some services registered or unregistered between (1) and (2) © Kai Tödter, Heiko Seeberger 14 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 15. Dynamic Services are difficult to handle (2) » Alternative solution: Reverse the steps » (1) First register a Service Listener to stay tuned » (2) Then look-up all existing services » Problem: Watch out for duplication! Best practice: Service Listeners are low-level and their usage is error-prone. Better use Service Trackers. © Kai Tödter, Heiko Seeberger 15 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 16. The Service Tracker » Utility class specified in OSGi Service Compendium » Package: “org.osgi.util.tracker” » Based on Service Listeners and “a lot of knowledge” » Services to be tracked may be specified by ... » ... a Service Interface name » ... a filter » Must be opened to start and closed to stop tracking » Handles service events via the methods » addingService() » modifiedService() » removedService() © Kai Tödter, Heiko Seeberger 16 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 17. Services in very dynamic Scenarios » Programmatic use of dynamic services works, but has some drawbacks: » Eager creation of services leads to » Large memory footprint » Long startup time » Increasing complexity with decreasing robustness » But is there anything out there that helps here? » Yes, services and dependencies can be specified declaratively! » Declarative Services » Spring Dynamic Modules » Others (e.g. iPOJO) © Kai Tödter, Heiko Seeberger 17 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 18. Agenda » Demo: A Swing App Framework based dynamic OSGi application » OSGi Services » Providing and consuming Services » Service Tracker » Overview Declarative Services & Spring Dynamic Modules » Declarative Services in Detail » Spring Dynamic Modules in Detail » Comparison (DS vs. DM) » Conclusion & Best Practices » Discussion © Kai Tödter, Heiko Seeberger 18 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 19. Overview DS & DM » The next 4 slides show just a very brief overview and examples » Details follow in the rest of this presentation © Kai Tödter, Heiko Seeberger 19 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 20. Declarative Services (DS) » DS is part of the OSGi R4 spec (Service Compendium) » DS let you declare components in XML » The declarations live in OSGI-INF/<component>.xml » Components can provide services » Components can depend on other services » Dependency injection for references to other services: » References may be bound to bind()-/unbind()-methods in components » A cardinality and a creation policy can be defined » Components need the bundle manifest header Service-Component e.g. Service-Component: OSGI-INF/personManager.xml © Kai Tödter, Heiko Seeberger 20 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 21. PM Example DS Component <component name=quot;pm.ui.actions.person.ActionContributionquot;> <implementation class=quot;pm.ui.actions.person.ActionContributionquot;/> <service> <provide interface= quot;pm.application.service.IActionContributionquot;/> </service> <reference name=quot;PersonManagerquot; interface=quot;pm.model.IPersonManagerquot; bind=quot;setPersonManagerquot; unbind=quot;removePersonManagerquot; cardinality=quot;0..1quot; policy=quot;dynamicquot;/> </component> © Kai Tödter, Heiko Seeberger 21 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 22. Spring Dynamic Modules (DM) » Integration of Spring DI and OSGi » XML files are placed in META-INF/spring directory, usually » One XML file to define a Spring bean » One XML file to map this bean to an OSGi service » Uses Spring dependency injection for references to other services and POJOs » Similar but more flexible/powerful approach compared with DS » But needs around 12 additional Spring and logging bundles to run © Kai Tödter, Heiko Seeberger 22 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 23. PM Example Spring DM Component XML for Spring Bean: <beans (schema attributes omitted)> <bean name=quot;savePersonquot; class=quot;pm.ui.actions.save.ActionContributionquot;/> </beans> XML for OSGi service mapping: <beans (schema attributes omitted)> <osgi:service id=quot;savePersonOSGiquot; ref=quot;savePersonquot; interface=quot;pm.application.service.IActionContributionquot;/> </beans> © Kai Tödter, Heiko Seeberger 23 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 24. Agenda » Demo: A Swing App Framework based dynamic OSGi application » OSGi Services » Providing and consuming Services » Service Tracker » Overview Declarative Services & Spring Dynamic Modules » Declarative Services in Detail » Spring Dynamic Modules in Detail » Comparison (DS vs. DM) » Conclusion & Best Practices » Discussion © Kai Tödter, Heiko Seeberger 24 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 25. Service Component Runtime » Providing a service means 1. Providing an implementation of a service interface 2. Register the implementation with the service registry » In programmatic approaches, this is usually done by the same bundle » In DS, the Service Component Runtime (SCR) takes care of » Registering/Unregistering the service implementation » Managing the lifecycle » DS introduces the notion of a Component that » Can provide services » Can depend on other services © Kai Tödter, Heiko Seeberger 25 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 26. Needed OSGi Bundles To run DS with Equinox, the following bundles are needed: » org.eclipse.osgi » org.eclipse.osgi.services » org.eclipse.equinox.ds » org.eclipse.equinox.util © Kai Tödter, Heiko Seeberger 26 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 27. DS Components Provides Services optional Component Component Description Instance (XML) (POJO) optional Depends on Service References © Kai Tödter, Heiko Seeberger 27 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 28. Component Activation » Lazy Activation (Delayed Component) » All dependencies must be resolved » On first request of the service interface the component is activated » This is the default behavior for components providing services » Eager Activation (Immediate Component): » As all dependencies can be resolved the component is created » This is expressed in XML by the component attribute immediate=quot;truequot; » This should be used only if there is a good reason for! » All components not providing services must be immediate components! © Kai Tödter, Heiko Seeberger 28 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 29. Component Activation (1) Create Load Component Bind target Call activate() Instance and Component services if present Component Instance class Context © Kai Tödter, Heiko Seeberger 29 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 30. Component Activation (2) » Component Instance class needs a default constructor » activate() and deactivate() may be supplied » Methods are found by reflection » May also be defined in super classes protected void activate(ComponentContext context) protected void deactivate(ComponentContext context) © Kai Tödter, Heiko Seeberger 30 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 31. Defining a DS Component » The <component>.xml file » Has to be placed in a directory OSGI-INF » Contains the XML code <component name=quot;ct...person.ActionContributionquot;> <implementation class=quot;ct...person.ActionContributionquot;/> </component> » Optional component attributes » immediate: if set true, the component is activated eagerly » Optional tags (see next slides) » service » reference » Components need the bundle manifest header Service-Component e.g. Service-Component: OSGI-INF/<component>.xml © Kai Tödter, Heiko Seeberger 31 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 32. Services and Properties » Specify the interface the component implements as a service, e.g. <service> <provide interface= quot;pm.application.service.IActionContributionquot;/> </service> » Also properties can be defined declaratively, e.g. <property name=quot;action.namequot; type=quot;Stringquot; value=quot;SavePersonActionquot;/> » The defined service will have the component’s properties © Kai Tödter, Heiko Seeberger 32 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 33. Defining References » DS uses dependency injection for references to other services » The SCR resolves all the references automatically » Only, if all references with respect to the cardinality (see next slide) can be resolved, the component will be activated <reference name=quot;PersonManagerquot; interface=quot;pm.model.IPersonManager“ ... /> © Kai Tödter, Heiko Seeberger 33 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 34. Reference Cardinality Cardinality Meaning Unary and optional 0..1 1..1 Unary and mandatory 0..n Multiple and optional 1..n Multiple and mandatory Example <reference name=quot;PersonManagerquot; ... cardinality=quot;0..1quot; /> © Kai Tödter, Heiko Seeberger 34 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 35. Accessing Services – Event Strategy » On (un)binding a referenced service a (un)bind method is called » Methods are found by reflection » Method names are specified in XML <reference name=quot;PersonManagerquot; ... bind=quot;setPersonManagerquot; unbind=quot;removePersonManagerquot; … /> » Parameters for bind/unbind method may be the service type or a ServiceReference, e.g. public synchronized void setPersonManager(IPersonManager personManager) © Kai Tödter, Heiko Seeberger 35 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 36. Reference Policy » How does unbinding of target services influence the life cycle? » Static policy: » Service Component is deactivated and ... » ... activated again if other service(s) available » Dynamic policy: » Life cycle is not affected, as long as references are satisfied <reference name=quot;PersonManagerquot; … policy=quot;dynamicquot;/> © Kai Tödter, Heiko Seeberger 36 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 37. DS Conclusion + Very easy to define components, services and references declaratively + SCR takes care of life cycle management and dependency resolution But  Dependency injection only works for other services, not for POJOs or DS components  Properties cannot be declared mandatory © Kai Tödter, Heiko Seeberger 37 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 38. Agenda » Demo: A Swing App Framework based dynamic OSGi application » OSGi Services » Providing and consuming Services » Service Tracker » Overview Declarative Services & Spring Dynamic Modules » Declarative Services in Detail » Spring Dynamic Modules in Detail » Comparison (DS vs. DM) » Conclusion & Best Practices » Discussion © Kai Tödter, Heiko Seeberger 38 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 39. Spring Dependency Injection » Application Context: Lightweight container » Beans: Non-invasive programming model » Dependency Injection © Kai Tödter, Heiko Seeberger 39 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 40. What is Spring DM? Spring Dynamic Modules focuses on integrating Spring Framework powerful, non-invasive programming model and concepts with the dynamics and modularity of OSGi platform. It allows transparent exporting and importing of OSGi services, life cycle management and control. (Spring DM Ref. Guide, 1.0) © Kai Tödter, Heiko Seeberger 40 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 41. Spring DM at a Glance © Kai Tödter, Heiko Seeberger 41 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 42. Applying the Extender Model © Kai Tödter, Heiko Seeberger 42 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 43. The Spring-Context Manifest Header © Kai Tödter, Heiko Seeberger 43 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 44. Application Context Creation Directive Effect create-asynchronously Create asynchronously as to OSGi thread? Default is true wait-for-dependencies Wait for mandatory dependencies? Default is true timeout Time in seconds to wait for mandatory dependencies before failing. Default is 300 publish-context Publish the Application Context as OSGi service? Default is true © Kai Tödter, Heiko Seeberger 44 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 45. Exporting Beans as OSGi Services (1) <service ref=quot;...quot; interface=quot;...quot;> © Kai Tödter, Heiko Seeberger 45 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 46. Exporting Beans as OSGi Services (2) service Attributes Meaning ref Bean to be exported as OSGi service interface FQCN of service interface. Alternatives: auto-export or interfaces sub- element auto-export Automatically manage service interfaces. disabled, interfaces, class-hierarchy, all-classes ranking Service property service.ranking © Kai Tödter, Heiko Seeberger 46 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 47. Importing Beans as OSGi Services (1) <reference id=quot;...quot; interface=quot;...quot; cardinality=quot;...quot;> <set|list id=quot;...quot; interface=quot;...quot; cardinality=quot;...quot;> © Kai Tödter, Heiko Seeberger 47 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 48. Importing Beans as OSGi Services (2) Attributes Meaning id Name of bean for referenced OSGi service interface FQCN of service interface. Alternative: interfaces sub-element filter OSGi filter expression to constrain service look-up cardinality reference: 0..1, 1..1 set|list: 0..N, 1..N © Kai Tödter, Heiko Seeberger 48 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 49. And what about Service Dynamics? » ServiceUnavailableException for invocations on stale references » Unary references (reference) are dynamic-aware » Re-binding with matching service when bound service goes away » Multiple references (set|list) are dynamic-aware » Collections and Iterators always up-to-date with service registry » Services with unsatisfied references are unregistered … » … and re-registered when satisfied again © Kai Tödter, Heiko Seeberger 49 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 50. Listening to Service Events <reference id=quot;...quot; interface=quot;...quot;> <listener bind-method=quot;...quot; unbind-method=quot;...quot;> <beans:bean class=quot;...quot;/> ... © Kai Tödter, Heiko Seeberger 50 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 51. Needed OSGi Bundles To run Spring DM the following additional bundles are needed: » spring-osgi-core-1.1.2.jar » spring-osgi-extender-1.1.2.jar » spring-osgi-io-1.1.2.jar » com.springsource.org.aopalliance-1.0.0.jar » spring-aop-2.5.5.jar » spring-beans-2.5.5.jar » spring-context-2.5.5.jar » spring-core-2.5.5.jar » com.springsource.slf4j.api-1.5.0.jar » com.springsource.slf4j.log4j-1.5.0.jar » com.springsource.slf4j.org.apache.commons.logging-1.5.0.jar » log4j.osgi-1.2.15-SNAPSHOT.jar © Kai Tödter, Heiko Seeberger 51 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 52. Spring DM Conclusion + Very easy to define Spring beans, OSGi services and references declaratively + Spring DM takes care of life cycle management and dependency resolution + Very powerful Dependency Injection But  Properties also cannot be declared mandatory © Kai Tödter, Heiko Seeberger 52 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 53. Agenda » Demo: A Swing App Framework based dynamic OSGi application » OSGi Services » Providing and consuming Services » Service Tracker » Overview Declarative Services & Spring Dynamic Modules » Declarative Services in Detail » Spring Dynamic Modules in Detail » Comparison (DS vs. DM) » Conclusion & Best Practices » Discussion © Kai Tödter, Heiko Seeberger 53 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 54. DS versus DM Topic OSGi DS Spring DM Ease of use ++ + Reducing complexity + ++ Lazy service activation/creation ++ -- Compatible with procedural OSGi service model ++ ++ Dependency Injection of Services + + Dependency Injection of POJOs -- ++ Current tooling support + + © Kai Tödter, Heiko Seeberger 54 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 55. Conclusion & Recommendation » We recommend to use either DS or DM rather than manually programming all the service infrastructure and life cycles » If the capabilities of DS are ok with you (or lazy activation is important), use DS » If you need DI or want to use Spring anyway, use Spring DM © Kai Tödter, Heiko Seeberger 55 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 56. Further Information » OSGi Alliance Specifications: Service Compendium, 112 Declarative Services Specification » Component Description schema detailed » Enabling Service Components » Factory Components » Spring Dynamic Modules » Other Service Component models » Apache Felix iPOJO © Kai Tödter, Heiko Seeberger 56 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  • 57. Discussion © Kai Tödter, Heiko Seeberger 57 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License