Hi Julian

I think this question is best asked on osgi-...@mail.osgi.org .

Regards
Carsten

Julian Sedding wrote
> Hi all
> 
> I have been puzzled recently when using DS Component Property Types by
> the following situation (see also FELIX-5404[0]):
> 
> @interface Config {
>     String[] whitelist default {};
> }
> 
> public class WhitelistComponent {
>     private String[] whitelist;
>     @Activate
>     void activate(Config config) {
>         this.whitelist = config.whitelist(); // throws NullPointerException
>     }
> }
> 
> Hopefully, you agree that this behaviour is unexpected and
> undesirable. I certainly did not expect a NullPointerException when
> calling "config.whitelist()"; I expected an empty array, as that's the
> default value I defined. (I actually believe this behaviour is in
> violation of the Java spec, see my comment in FELIX-5404).
> 
> After the discussion in FELIX-5404 I did some more reading in the
> spec, but I am still not entirely sure if the problem is in the spec
> or in the implementation.
> 
> When I look at the generated metatype information the XML files
> contain the empty array as default value. The Metatype Service Spec
> 1.3 clearly defines the case of an empty array default values: "[...]
> The empty string is significant and must be seen as an empty List or
> array if specified as the default for an attribute with a cardinality
> that is not equal to zero. [...]" (105.7.1 XML Schema of a Meta Type
> Resource).
> 
> However, the Declarative Services Spec 1.3 is less clear about empty
> array default values. As I read it, an array (default) value must be
> represented in the <property> tag's body: "[...] If the value
> attribute is not specified, the body of the property element must
> contain one or more values. The value of the property is then an array
> of the specified type. [...]". However, it mandates that there be one
> or more values, thus explicitly excluding the possibility to represent
> an empty array. Our tooling seems to omit any <property> tags with an
> empty default value. It is unclear to me how an empty array default
> value can or should be represented in a component descriptor.
> 
> AFAIU the metatype does not factor in when component configurations
> are concerned, hence the default value present in the metatype is
> irrelevant for this situation.
> 
> This leaves two possible places where this behaviour could be fixed:
> 
> 1. My understanding is wrong and an empty array default value can be
> represented in the component descriptor XML. Then I believe we need to
> fix our tooling.
> 2. When Component Property Types are used, the annotation's default
> values should be consulted as a last resort (i.e. if no service
> property is set). We would need to check whether this is compliant
> with the spec, however.
> 
> The third option is to accept this oddity and leave the implementation
> as-is. However, this would likely confuse users of component property
> types and negate some of their benefits (i.e. null checks would still
> be necessary, even if default values are used).
> 
> Thanks for your thoughts and insights!
> 
> Regards
> Julian
> 
> [0] https://issues.apache.org/jira/browse/FELIX-5404
> 



-- 
Carsten Ziegeler
Adobe Research Switzerland
cziege...@apache.org

Reply via email to