Hi,
I am not sure about the best names for the annotations. Sling is not really 
consistent whether the resource has properties (which smells a bit like JCR) or 
values. Actually the name ValueMap indicates, that the proper name for Sling is 
rather value than property, but even the Javadoc mentions “property" (e.g. at 
http://sling.apache.org/apidocs/sling6/org/apache/sling/api/resource/ValueMap.html).
What do you think about the annotations @Value (for source value-map), 
@OsgiService, @ChildResource, @ScriptVariable, @RequestAttribute?

Regards,
Konrad


On 19 Mar 2014, at 09:19, Georg Henzler <sl...@cq-eclipse-plugin.net> wrote:

> Hi all,
> 
> +1 for having meta annotations, I think they make model classes a lot more 
> readable and give a small performance boost (outweighs the use of 
> standardised @Inject IMHO).
> 
> Regarding the naming I'd choose @ResourceProperty avoiding the name clash 
> with @org.apache.felix.scr.annotations.Property and making it immediately 
> visible to new developers that @ResourceProperty is different from @Property. 
> I think @ChildResource and @OsgiService are good names for the other two.
> 
> Regards
> Georg
> 
> Am 18.03.2014 18:12, schrieb Justin Edelson:
>> Hi Konrad,
>> How about just @Property and @ChildResource ? As with the @Model
>> annotation, I don't see a reason to add "sling" as it is already in
>> the package name.
>> 
>> @Property has overlap with SCR annotations, but I can't think of a
>> reason you would have them in the same class (and in any case, that's
>> what packages are for).
>> 
>> While I'm not opposed to the optional attributes, I'm worried that the
>> extra attributes will make the code more convoluted. If you have the
>> time, I say try to do it, just be on the lookout for adding
>> complexity. And also make sure that there aren't any dependencies on
>> these new annotations in the core AdaptorFactory. Someone else will
>> need to implement their own annotations to imply @Inject
>> @Source("my-custom-source") with @MyCustomSource
>> 
>> Regards,
>> Justin
>> 
>> On Tue, Mar 18, 2014 at 11:55 AM, Konrad Windszus <konra...@gmx.de> wrote:
>>> Hi Justin,
>>> great. Thanks a lot for that fix. What do you think of the following 
>>> annotations:
>>> 
>>> @SlingProperty (implies @Inject and @Source("valuemap"))
>>> @OsgiService (implies @Inject and @Source("osgi-service"))
>>> @SlingChildResource  (implies @Inject and @Source("child-resource"))
>>> 
>>> In my regard they could also provide the optional attributes
>>> - name (for SlingProperty and ChildResource only)
>>> - filter (for OsgiService only)
>>> - and via (for SlingProperty and ChildResource only)
>>> 
>>> but that would require additional refactoring on either the injector or the 
>>> adapterFactory side. The advantage is, that it is easier for the developer 
>>> to look up what is supported for a specific injector (by leveraging code 
>>> completion in his IDE), instead of remembering annotations (even if those 
>>> are standard CDI annotations) and look up in the documentation whether that 
>>> feature is supported for a specific injector.
>>> 
>>> WDYT?
>>> 
>>> Thanks,
>>> Konrad
>>> 
>>> 
>>> On 18 Mar 2014, at 16:08, Justin Edelson <jus...@justinedelson.com> wrote:
>>> 
>>>> Hi Konrad,
>>>> I don't know about those names (@InjectSlingValue specifically -
>>>> what's a "Sling Value"?), but I think making @Inject work via
>>>> meta-annotations make sense. That support already exists for @Source,
>>>> would just need to be extended to work with @Inject as well. I just
>>>> did a little refactoring to make the meta-annotation support easier to
>>>> extend in the future.
>>>> 
>>>> Whatever you submit, please just ensure there are tests included.
>>>> 
>>>> Regards,
>>>> Justin
>>>> 
>>>> On Tue, Mar 18, 2014 at 10:54 AM, Konrad Windszus <konra...@gmx.de> wrote:
>>>>> Hi Justin,
>>>>> thanks for your answer. What about if I come up with a patch for 
>>>>> additional annotations like
>>>>> @InjectSlingValue and @InjectOsgiService
>>>>> which are just another way of annotating fields/methods and combine 
>>>>> logically both the Inject and the Source. In case of InjectOsgiService 
>>>>> one could even include the optional attribute filter which would add the 
>>>>> @Filter then. For that I would like to use the meta annotation concept 
>>>>> (i.e. annotation the @InjectSlingValue with @Inject and @Source). Since 
>>>>> Java does not come with support for meta annotations out of the box, one 
>>>>> could just copy the according method from the Spring Core: 
>>>>> https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java#L94
>>>>>  and use that in the ModelAdapterFactory.
>>>>> 
>>>>> Would you accept such a patch which would basically comprise of
>>>>> a) an additional annotation per injector
>>>>> b) additionally evaluating the annotations on annotations within the 
>>>>> ModelAdapterFactory
>>>>> 
>>>>> Thanks,
>>>>> Konrad
>>>>> 
>>>>> On 17 Mar 2014, at 19:01, Justin Edelson <jus...@justinedelson.com> wrote:
>>>>> 
>>>>>> Hi Konrad,
>>>>>> (a) is correct and is intentional. Is there an actual situation where
>>>>>> this would happen accidentially? In my experience, a new BVP is not
>>>>>> added every day and has a broad impact. If you add a BVP without
>>>>>> regressing your application, that's a problem into itself.
>>>>>> 
>>>>>> (b) and (c) would only be correct if the type of the OSGi service is
>>>>>> something to which your child resource or request attribute could be
>>>>>> adapted, which seems highly unlikely to me.
>>>>>> 
>>>>>> The JCR operations (property lookup and child node lookups) should be
>>>>>> well-optimized by implementations. If there was an injector which
>>>>>> executed a query, that would be an example of a place where the
>>>>>> injector *should* require @Source or some other annotation to
>>>>>> explicitly include the injector.
>>>>>> 
>>>>>> If you want to introduce a "strict" mode which requires @Source, feel
>>>>>> free to submit a patch. But I don't think this makes sense as the
>>>>>> default.
>>>>>> 
>>>>>> Regards,
>>>>>> Justin
>>>>>> 
>>>>>> On Mon, Mar 17, 2014 at 1:24 PM, Konrad Windszus <konra...@gmx.de> wrote:
>>>>>>> Hi,
>>>>>>> I am a little bit worried that model classes which leverage the Sling 
>>>>>>> Models annotations might be slow and break fast.
>>>>>>> 
>>>>>>> If you use the annotation @Inject without @Source all injectors are 
>>>>>>> asked until one returns a value.
>>>>>>> Since almost all injectors depend on the fieldname and cover the same 
>>>>>>> namespace, models can break very easily.
>>>>>>> Let me give three examples for broken models:
>>>>>>> 
>>>>>>> a) If I use in my model
>>>>>>> @Inject
>>>>>>> String myattribute;
>>>>>>> which used to be resolved by the ValueMap injector and I just 
>>>>>>> introduced a new Scripting variable with the name "myattribute" 
>>>>>>> (https://cwiki.apache.org/confluence/display/SLING/Adding+New+Scripting+Variables),
>>>>>>>  my model would no longer work.
>>>>>>> b) The same would apply, if I have a Sling resource with a value named 
>>>>>>> "service" which used to be (by coincidence) also the field name of my 
>>>>>>> injected OSGi service in the model.
>>>>>>> c) The same for a new request attribute, whose name conflicts with the 
>>>>>>> field name of my injected OSGi service in the model
>>>>>>> 
>>>>>>> Regarding the performance, I fear that the lookup in the value map from 
>>>>>>> the second injector might take some time (since JCR access is necessary 
>>>>>>> in most cases to do that). For example if I have a model class only 
>>>>>>> relying on OSGi services a lot of time would be wasted by asking other 
>>>>>>> injectors.
>>>>>>> 
>>>>>>> To summarize: Isn't it always advisable to use the @Source annotation 
>>>>>>> to prevent those kind of name clashes and performance issues? Shouldn't 
>>>>>>> that be explicitly stated in the documentation?
>>>>>>> What is your opinion on that?
>>>>>>> 
>>>>>>> What about making the @Source mandatory for all injectors but the 
>>>>>>> ValueMap injector?
>>>>>>> Thanks,
>>>>>>> Konrad
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>> 
>>> 

Reply via email to