Date: 2004-08-09T15:54:01
   Editor: AchimHuegen <[EMAIL PROTECTED]>
   Wiki: Jakarta HiveMind Wiki
   Page: ServiceImplementationSwitch
   URL: http://wiki.apache.org/jakarta-hivemind/ServiceImplementationSwitch

   no comment

New Page:

= Problem Description =

AchimHuegen, August 9 2004

This proposal is about multiple implementations of the same service interface.
The problem has already been described in this proposal: 
ConditionalContributionsProposal.

I dont't think that the example used there (pick implementation depending on 
jdk version and library availability) is a very common use case. For me the 
most important use cases are:
  * Select most appropriate implementation for your application out of a set of 
possible candidates (e.g. security realms: JDBCRealm, JNDIRealm, MemoryRealm)
  * Switch all services of a middleware connector to dummy implementations

= Proposed Solution =

I have one problem with the solution from ConditionalContributionsProposal:
The decision how to switch implementations technically is not made at the 
application level. E.g. the first provider of a service implementation decides 
to use a system property. Now all applications that use this service must 
provide this system property. But different providers means different methods 
and finally your application has to deal with inconsistent implementation 
selection.  

So here is my approach:
Implementations get a name and via a contribution a mapping from service to an 
implementation is defined by referencing its name.

{{{
<service-point id="foo.service" interface="foo.MultipleService" />
    
<implementation service-id="foo.service" >
    <create-instance class="foo.serviceImplDefault" />
</implementation>

<implementation service-id="foo.service" >
    <create-instance name="implementation1" class="foo.serviceImpl1" />
</implementation>

<contribution configuration-id="hivemind.ServiceImplementationSwitch" >
    <switch service-id="foo.service" implementation="implementation1" />
</contribution>
}}}

This example shows a service point with two implementations. The first 
implementation is the default and has no name. The second one is named 
"implementation1".
The contribution tells the registry to use the latter one when creating 
instances of this service.

== Default implementation ==

If only one implementation exists it is the default. 
If multiple implementations exist and one is unnamed, then its the default. If 
no mapping is defined, then the default implementation is used.

== Symbol sources ==

You can use symbols in the configuration immediately. E.g. a system property:
{{{
<contribution configuration-id="hivemind.ServiceImplementationSwitch" >
    <switch service-id="foo.service" implementation="{propertyFooService}" />
</contribution>
}}}

== Extensions ==

=== Wildcards ===
Switch all implementations matching a wildcard. More concrete definitions have 
higher priority:
{{{
<contribution configuration-id="hivemind.ServiceImplementationSwitch" >
    <switch service-id="foo.*" implementation="dummy" />
    <switch service-id="foo.connectors.*" implementation="local" />
</contribution>
}}}

=== Expression Language ===
The expression language from ConditionalContributionsProposal could be 
integrated.
{{{
<contribution configuration-id="hivemind.ServiceImplementationSwitch" >
    <switch service-id="foo.service" implementation="{propertyFooService}" 
        condition="jdk(1.4)" />
</contribution>
}}}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to