[ 
https://issues.apache.org/jira/browse/FELIX-5177?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15133254#comment-15133254
 ] 

Pierre De Rop commented on FELIX-5177:
--------------------------------------

I committed a slightly modified version in revision 1728564, because there was 
an issue regarding how the callback was invoked.
(I also clarified the javadoc and added some comments in the source).

So, the problem was the following: so far, we had three "setCallback" methods:

- setCallback(String method): the callback is invoked on an instantiated 
component. This is because we have to invoke the updated callback on the 
component instance synchronously, in the CM "update" thread.

- setCallbacks(Object callbackInstance, String callback): The callback is 
invoked on the callbackInstance, but at this point, the component is not 
instantiated. This is typically used in a use case where the callbackInstance 
acts as a Factory for the component, so the Factory is called in the updated 
callback, then it can store the configuration, and later, when the component is 
instantiated, then the Factory.create() method is then called, and can use the 
already injected configuration before instantiating the component instance(s).

- setCallbacks(Object callbackInstance, String callback, boolean 
needsInstance): Here, you explicitly specify whether or not you want an 
instantiated component at the time the callback is invoked on the  
callbackInstance.

That being said, now there was a problem in your setCallback(Object instance, 
String callback, Class<?> configType) method:

{code}
    public ConfigurationDependency setCallback(Object instance, String 
callback, Class<?> configType) {
        setCallback(instance, callback, false);
        m_configType = configType;
        return this;
    }
{code}

This is correct: since the signature contains a callbackInstance, then we don't 
needs the component instance.
But the problem is that the itegration test was calling "setCallback(null, 
"updated", MyConfig.class)". So, in the case, since 
no callback instance we specified, then in this case the last parameter flag 
(needsInstance) should be "true", and not "false".

So, I reworked the proposed patch in order to check if the callbackInstance was 
null.

Now, in the ConfigurationDependencyTest, there was a small issue: the 
ConfigurationConsumerWithTypeSafeConfiguration class was ensuring that "init" 
was called before "updated":

{code}
    static class ConfigurationConsumerWithTypeSafeConfiguration {
        private final Ensure m_ensure;

        public ConfigurationConsumerWithTypeSafeConfiguration(Ensure e) {
            m_ensure = e;
        }

        public void updated(Component component, MyConfig cfg) throws 
ConfigurationException {
            Assert.assertNotNull(component);
            Assert.assertNotNull(cfg);
            m_ensure.step(3);
            if (!"testvalue".equals(cfg.getTestkey())) {
                Assert.fail("Could not find the configured property.");
            }
        }

        public void init() {
            m_ensure.step(2);
        }
    }
{code}

but this is not correct: the "updated" method must be called first, then the 
init() method must be called.
So, in the init(), we should call "step(3) and in the updated(), we should call 
step(2).

I also introduced two more following signatures in the API:

{code}
    ConfigurationDependency setCallback(String callback, Class<?> configType);
    ConfigurationDependency setCallback(Object instance, String callback, 
Class<?> configType, boolean needsInstance);
{code}

Indeed, I need these kind of signatures, specially the last one in the context 
of dependency manager lambda.


So, now, the next steps are the following:

1) I will rework all the samples in order to replace the usage of the bndlib 
"Configurable" using the new type-safe setCallbacks method

2) I also have to update the documentation.

3) I will also add support for type-safe setCallbacks in the dm-lambda library, 
and will update the samples with some method references, instead of the method 
callbacks

4) I will finally modify the DM annotations in order to allow to apply a 
@ConfigurationDependency on the new callback method signatures.

in the end, this patch is a great improvement !

> Support injecting configuration proxies
> ---------------------------------------
>
>                 Key: FELIX-5177
>                 URL: https://issues.apache.org/jira/browse/FELIX-5177
>             Project: Felix
>          Issue Type: Improvement
>          Components: Dependency Manager, Dependency Manager Annotations, 
> Dependency Manager Lambda, Dependency Manager Runtime
>            Reporter: J.W. Janssen
>            Assignee: Pierre De Rop
>             Fix For:  org.apache.felix.dependencymanager-r7
>
>         Attachments: FELIX-5177.patch
>
>
> DM supports mandatory configurations, but does not allow anything other than 
> a dictionary to be passed to the callback. In other DI frameworks (like DS) 
> it is possible to use type-safe configurations and let those be injected 
> instead of plain dictionaries.
> It would be great if DM also would support this, as it would remove lots of 
> configuration boiler plate code from our projects.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to