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

Stefan Seifert commented on FELIX-1010:
---------------------------------------

thanks for applying & reviewing so far!

> - The maven project using the annotations requires the scrplugin-annotation 
> module (containing the annotations) as a compile dependency; maybe we can 
> find a way of adding this dependency by the scr plugin to the classpath

to make the annotations really useful in IDE's like eclipse you need this 
project as a maven dependency in any way to be included when generating the 
eclipse project files, and to get inline documentation of the annotations. the 
dependency type could be set to "provided", so its not included in the 
dependency chain. so, even if we find a way of providing the dependency only in 
the plugin's classpath, the IDE support will suffer.

> - The retention policy for the annotations needs to be RUNTIME, otherwise the 
> scr plugin does not get the annotations as the vm loads the classes but does 
> not retain the annotations. RUNTIME requires to have the annotations 
> available at runtime as well, so although they are not used anymore we would 
> need to make a bundle out of the annotations

yes, i ran into this already. using reflection for reading annotations form 
generated classfiles requires to set the policy to RUNTIME. there is no other 
way with the code implemented in the way currently. policy SOURCE is really 
only useful for IDEs an other tools, who are parsing the source files by 
themselves. after submitting the patch i thought if the qdox library can be 
used for exactly this job - parsing the source files and read the java 
annotations (not the doclet tags). but it seems the qdox library does not 
support this, and i've not checked if there are other libraries helping reading 
SOURCE level annotations from source files.

>- The valueRef and nameRef attributes for properties are currently not 
>supported. This is a very nice feature which allows to reference an existing 
>Constant for a value or name.
Apart from these problems, the ide support is nice :)

if dropped the support for them by design, because as far as i unterstood the 
syntax, they helped only referencing an existing java constant instead of a 
hard-coded value. but with java annotations, you can use this already with the 
value and name properties, and you do not need them any more as separate 
properties. or did i miss something that cannot be expressed with the new 
annotations in the current implementation?

> - adding missing documentation (hint :) )

i recommend maintaining the information concerning the qdox annotations and the 
java annotations on the same page, because my intention was to name all 
properties the same way (where possible), to keep the docs+usage in synch 
easily. i've not figured out yet where the documentation of the felix 
subprojects are maintained or patches can be applied to (is it a wiki?)

> add java annotation support to felix-scr-plugin
> -----------------------------------------------
>
>                 Key: FELIX-1010
>                 URL: https://issues.apache.org/jira/browse/FELIX-1010
>             Project: Felix
>          Issue Type: New Feature
>          Components: Maven SCR Plugin
>    Affects Versions: maven-scr-plugin-1.0.10
>            Reporter: Stefan Seifert
>            Assignee: Carsten Ziegeler
>             Fix For: maven-scr-plugin-1.0.11
>
>         Attachments: 090329_felix_scrplugin_annotationsupport.patch
>
>
> goals of this proposal:
> - allow definition of SCR components with java annotations instead of QDox 
> tags
> - advantages: strong typing, auto-completion and jump to source documentation 
> in modern IDEs
> - support built-in annotations with 1:1 matching the old scr.* tags, and 
> allow definition of custom annotations for other felix/scr-based projects to 
> minimalize syntax overhead
> - the QDox tags are still supported, but cannot be mixed with annotations 
> whithing the same source file
> attached to this ticket is a full implemented and tested patch, that supports 
> all feates supported by the scr.* QDox tags today. some of the more "exotic" 
> features are not tested in detail, only the generated descriptors where 
> compared.
> i created a new project "scrplugin-annotations", that contains only the 
> annotations for easy referencing without unwanted transitive dependencies. 
> i'm not sure if the package and artifact name are well chosen.
> Example 1
> ---------
> QDox version:
> /**
>  * Service class with QDox annotations.
>  * 
>  * @scr.component
>  * @scr.property name="testProperty" value="testValue"
>  * @scr.service
>  */
> public class MinimalServiceQDox implements {
> ...
> Annotation version:
> /**
>  * Service class with java annotations.
>  */
> @Component
> @Property(name = "testProperty", value = "testValue")
> @Service
> public class MinimalServiceAnnotations {
> ...
> Example 2
> ---------
> QDox version:
> /**
>  * Service class with QDox annotations.
>  * 
>  * @scr.component name="QDoxName" label="theLabel" 
> description="theDescription"
>  *                immediate="false" enabled="false" factory="xx.yy.zz"
>  * @scr.service interface="org.osgi.service.component.ComponentInstance"
>  *              servicefactory="true"
>  * @scr.service interface="java.lang.Readable"
>  * @scr.property name="stringProp" value="theValue" label="thePropLabel"
>  *               description="thePropDesc" options 0="option0" 1="option1"
>  *               2="option2"
>  * @scr.property name="intProp" value="5" type="Integer"
>  * @scr.property name="multiProp" values.0="multiValue1" 
> values.1="multiValue2"
>  */
> public class ServiceQDox implements ComponentInstance, Readable {
>     /**
>      * @scr.reference cardinality=0..1, dynamic=true
>      */
>     MinimalServiceQDox reference;
> ...
> Annotation version:
> /**
>  * Service class with java annotations.
>  */
> @Component(name = "AnnotName", label = "theLabel", description = 
> "theDescription", immediate = false, enabled = false, factory = "xx.yy.zz")
> @Services( { @Service(value = ComponentInstance.class, serviceFactory = 
> true), @Service(Readable.class) })
> @Properties( {
>         @Property(name = "stringProp", value = "theValue", label = 
> "thePropLabel", description = "thePropDesc", options = {
>                 @PropertyOption(name = "0", value = "option0"), 
> @PropertyOption(name = "1", value = "option1"),
>                 @PropertyOption(name = "2", value = "option2") }),
>         @Property(name = "intProp", value = "5", type = Integer.class),
>         @Property(name = "multiProp", value = { "multiValue1", "multiValue2" 
> }) })
> public class ServiceAnnotations implements ComponentInstance, Readable {
>     @Reference(cardinality = ReferenceCardinality.ZERO_TO_ONE, policy = 
> ReferencePolicy.DYNAMIC)
>     MinimalServiceAnnotations reference;
> ...
> Example 3 - using Custom Annotation from other project
> ------------------------------------------------------
> QDox version:
> /**
>  * Sample servlet with sling mappings.
>  * 
>  * @scr.component immediate="true"
>  * @scr.service interface="javax.servlet.Servlet"
>  * @scr.property name="sling.servlet.methods" value="GET"
>  * @scr.property name="sling.servlet.resourceTypes"
>  *               value="/apps/test/components/samplecomponent"
>  * @scr.property name="sling.servlet.extensions" values.0="html" 
> values.1="json"
>  */
> public class SlingServletQDox implements Servlet {
> Annotation version:
> /**
>  * Sample servlet with sling mappings.
>  */
> @SlingServlet(methods = "GET", resourceTypes = 
> "/apps/test/components/samplecomponent", extensions = { "html", "json" })
> public class SlingServletAnnotation implements Servlet {
> Custom annotation mappings can be integrated by defining a class implementing 
> "org.apache.felix.scrplugin.tags.annotation.AnnotationTagProvider" for the 
> new plugin property "annotationTagProviders" in the pom.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to