Hi,

If the consumer and the provider are based on iPOJO (i.e. are iPOJO instances) 
then the CreationStrategy can be much more fine grain. 

I recommend to extend 
org.apache.felix.ipojo.handlers.providedservice.strategy.ConfigurableCreationStrategy
 instead of CreationStrategy as it hides some magic. 

Regards,

Clement

On 10.05.2012, at 14:29, Richard S. Hall wrote:

> Yes, that allows you to configure each service instance for the receiver, but 
> technically you could do this simply with ServiceFactory if you were 
> implementing the service factory yourself. However, since you are using 
> iPOJO, then you need to implement a custom strategy, which is effectively 
> equivalent to implementing a service factory.
> 
> Your original desire to assign a different service property to each service 
> is not really possible, since the service only has one service registration 
> (and associated properties) no matter if it is a service factory or a single 
> global object.
> 
> -> richard
> 
> On 5/10/12 05:01 , Adrian Mörchen wrote:
>> Okay, solved the problem my elf.
>> 
>> The solution is quite simple, when known: Implementing a custom 
>> CreationStrategy:
>> 
>> @Component
>> @Provides(strategy = "my.service.MyServiceCreationStrategy")
>> @Instantiate
>> public class MyServiceImpl implements MyService {
>> 
>>     private final String symbolicName;
>> 
>> 
>>     /**
>>      * Constructor.
>>      *
>>      * @param context
>>      *            Context of the current bundle.
>>      */
>>     public MyServiceImpl(String symbolicName) {
>>         this.symbolicName = symbolicName;
>>     }
>>      
>>      ...
>> }
>> 
>> package my.service;
>> 
>> public class MyServiceCreationStrategy extends CreationStrategy {
>> 
>>     private final Map<String, MyService>  services = new HashMap<String, 
>> MyService>();
>> 
>>     /**
>>      * {@inheritDoc}
>>      */
>>     @Override
>>     public Object getService(Bundle bundle, ServiceRegistration 
>> registration) {
>>         String symbolicName = bundle.getSymbolicName();
>>         MyService myService = services.get(symbolicName);
>>         if (myService == null) {
>>             myService = new MyServiceImpl(symbolicName);
>>             services.put(symbolicName, myService);
>>         }
>>         return myService;
>>     }
>> 
>>     /**
>>      * {@inheritDoc}
>>      */
>>     @Override
>>     public void ungetService(Bundle bundle, ServiceRegistration 
>> registration, Object service) {
>>         services.remove(bundle.getSymbolicName());
>>     }
>>      
>>     /**
>>      * Does nothing.
>>      *
>>      * {@inheritDoc}
>>      */
>>     @Override
>>     public void onPublication(InstanceManager instance, String[] interfaces, 
>> Properties props) {
>>         // Do nothing.
>>     }
>> 
>>     /**
>>      * Does nothing.
>>      *
>>      * {@inheritDoc}
>>      */
>>     @Override
>>     public void onUnpublication() {
>>         // Do nothing.
>>     }
>> 
>> -----Ursprüngliche Nachricht-----
>> Von: Adrian Mörchen [mailto:[email protected]]
>> Gesendet: Donnerstag, 10. Mai 2012 08:12
>> An: [email protected]
>> Betreff: AW: Problem creating separate service for each bundle
>> 
>> Thanks Richard,
>> 
>> yep  a basic musunderstanding on my site. But is it still possible to do 
>> this? Creating an instance with information about the bundle requesting it?
>> 
>> -----Ursprüngliche Nachricht-----
>> Von: Richard S. Hall [mailto:[email protected]]
>> Gesendet: Mittwoch, 9. Mai 2012 16:43
>> An: [email protected]
>> Betreff: Re: Problem creating separate service for each bundle
>> 
>> It sounds like you have a basic misunderstanding. The SERVICE strategy 
>> implements the OSGi Service Factory concept and automatically creates a 
>> unique service object instance for each bundle that requests the service. It 
>> doesn't mean that each requesting bundle will become the provider of the 
>> unique service instance. The provider is always the provider.
>> 
>> ->  richard
>> 
>> On 5/9/12 10:24 , Adrian Mörchen wrote:
>>> Hi,
>>> 
>>> I want to create a separate instance of a service with the bundles symbolic 
>>> name as field.
>>> 
>>> I've read somewhere that this should be possible using "SERVICE" as 
>>> strategy:
>>> 
>>> @Component
>>> @Provides(strategy = "SERVICE")
>>> @Instantiate
>>> public class MyServiceImpl implements MyService {
>>> 
>>>      private final String symbolicName;
>>> 
>>> 
>>>      /**
>>>       * Constructor.
>>>       *
>>>       * @param context
>>>       *            Context of the current bundle.
>>>       */
>>>      public MyServiceImpl(BundleContext context) {
>>>          this.symbolicName = context.getBundle().getSymbolicName();
>>>      }
>>> 
>>>       ...
>>> }
>>> 
>>> Unfortunately this doesn't work . The bundle context is always the
>>> context of the bundle providing the service, but I want it to be the 
>>> context of the bundle requiring the context.
>>> 
>>> Any hints, how to solve this?
>>> 
>>> 
>>> ·         The only more specific tutorial on this I found: 
>>> http://ipojo-dark-side.blogspot.de/2009/04/customized-service-object-creation-with.html
>>> 
>>> o   But it's quite old and
>>> 
>>> o   Not a full working example, which makes it hard to understand
>>> 
>>> ·         Also a custom factory method doesn't work.
>>> 
>>> Thanks,
>>> 
>>> Adrian
>>> 
>>> 
>>> 
>>> 
>>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to