I'm asking about this inside osgi as well. Factory components in DS have a number of oddities that make them unusable in many scenarios. I'd like to suggest that some type of factory component work very similarly to components configured from config admin with a factory PID, but with the configuration info supplied in code to the ComponentFactory newInstance method or a new ComponentInstance modified method.
1. Factory components are only registered when their references are satisfied, based on the default target filters from xml config or properties. (112.5.5) This might be plausible if you are not setting target filters for references in the configuration, but if you are why would you have to wait for _some_ possible reference targets to be registered when those are not likely to be the ones actually bound? 2. The situation is worse if you want to set target filters. (112.5.5) further explains that if the target filters are not satisfied when newInstance is called, you get a ComponentException thrown rather than a component waiting for the reference it needs to show up. Furthermore if any target filter for a required reference becomes unsatisfied the component is permanently disposed of without any notice. It is possible to track service events yourself to keep trying to create your component but this is sort of ridiculous. 2. There is no way to modify the configuration of a component instance created from a factory component. What I would find useful would be a new kind of factory component where: 1. The ComponentFactory service is registered when the component is enabled, irrespective of whether any references are satisifed. 2. Calling newInstance always creates and enables a component right away, whether or not the references are satisfied. 3. The component created from newInstance persists until it is explicitly disposed with the ComponentInstance.dispose() method or the bundle is stopped 4. ComponentFactory.newInstance return a subclass of ComponentInstance, say FactoryInstance, with a modified(Dictionary) method that will update the component properties, including (if the component is registered as a service) the service properties, just like a CA configuration update will update a component. I'd expect this method would not be accessible from the ComponentContext.getComponentInstance() component instance object. Something would have to turn this new behavior on, either a new name for the factory attribute (xml and annotation) or an additional attribute. The possibility of modifying a factory instance configuration could work for the current style of component factory as well. ------------ My use case for this is to provide a way to process (or ignore) Configurations for DS component similar to what is provided for ManagedServices and ManagedServiceFactories via ConfigurationPlugins. DS runs off of configuration events and configuration plugins are not applied to configurations retrieved from CA, only to those pushed into MS and MSFs. In addition I think this style of component factory would generally be much more useful than the current factory components. Thoughts? many thanks david jencks
