[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [equinox-dev] Declarative Services use case and inconsistencies between old and new (ProSyst-contributed) implementations
|
Finally, on third read, I saw your reference cardinality is 0..n, so your
bind method now makes sense to me :) . Also the changes in
ComponentReference.bind() and unbind() will have to be done.
Best regards,
Stoyan
Stoyan Boshev wrote:
>
> Jeremy, you really made me read again certain parts of the DS spec ;)
>
> On second read I see something not clear to me in the code snippet of your
> bind method. According to DS spec (112.5.6 Activation), the component
> references' bind methods are called before calling the activate method of
> the component. The activate method is the place where the component gets
> its ComponentContext. Why do you use the component context in the bind
> method?
> If I am right then there is no need to change anything in the bind and
> unbind methods of ComponentReference.
>
> BR,
> Stoyan
>
>
> Jeremy Volkman wrote:
>>
>> Hi all,
>>
>> We've recently switched to the ProSyst implementation of SCR in hopes of
>> overcoming many of the issues the old one had. I've encountered an
>> implementation detail with the new version that affects one of my
>> standard
>> practices.
>>
>> We use the whiteboard pattern in a bunch of places to register extensions
>> to
>> certain things (similar to the use of Eclipse's Extension registry).
>> With
>> many of the extension objects, service properties are used to define some
>> metadata.
>>
>> My general methodology is to declare a component that has a reference to
>> the
>> particular extension interface with cardinality 0..n. I then create a
>> bind
>> method that looks something like this:
>>
>> public void extensionAdded(ServiceReference extensionRef) {
>> String extensionId = (String) extensionRef.getProperty("extension.id");
>> String extensionName = (String)
>> extensionRef.getProperty("extension.name
>> ");
>> IExtension extension = (IExtension)
>> componentContext.locateService("extensions",
>> extensionRef);
>> registerExtension(extensionId, extensionName, extension);
>> }
>>
>> It's necessary to have a bind method that takes type ServiceReference in
>> order to get these service properties. AFAIK there is no way to get
>> service
>> properties after this method has been called other than storing them
>> locally
>> (there is no "locateServiceReferences()" method).
>>
>> This used to work with the original implementation of SCR, however the
>> ProSyst implementation returns null when I call locateService(String,
>> ServiceReference) from within the bind method. I've tracked the issue
>> down
>> to the following code at ComponentReference.java:250:
>>
>> try {
>> bindMethod.invoke(instance.getInstance(), params);
>> } catch (Throwable t) {
>> Activator.log.error(
>> "[SCR] Error while trying to bind reference "
>> + this, t);
>> // rethrow exception so resolver is eventually notified that
>> // this component is bad
>> // throw t;
>> } finally {
>> ** serviceReferences.addElement(serviceReference);
>> SCRUtil.release(params);
>> }
>>
>> The marked line is the issue. The bound ServiceReference is being added
>> to
>> the ComponentReference's list of tracked ServiceReference after the bind
>> method is being invoked. The locateService(String, ServiceReference)
>> method
>> fails to match the passed ServiceReference to this internal list, and
>> thus
>> returns null. I can only assume that the original SCR implementation (
>> org.eclipse.equinox.ds) stores the ServiceReference before invoking the
>> bind
>> method.
>>
>> I couldn't find anything in the DS spec that was clear about which way to
>> act in this situation, which is why I'm posting here and not in a bug
>> report. Should I be able to locate the service object for a
>> ServiceReference from within the bind method? If not, how can I ever get
>> service properties for DS-controlled references?
>>
>> At this point I'm going to patch the code locally to add the
>> ServiceReference before invoking the bind method and hope that is the
>> correct behavior. :)
>>
>> Thanks,
>> Jeremy Volkman
>>
>> _______________________________________________
>> equinox-dev mailing list
>> equinox-dev@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/equinox-dev
>>
>>
>
>
--
View this message in context: http://www.nabble.com/Declarative-Services-use-case-and-inconsistencies-between-old-and-new-%28ProSyst-contributed%29-implementations-tf3573886.html#a10055775
Sent from the Equinox - Dev mailing list archive at Nabble.com.