[ https://issues.apache.org/jira/browse/FELIX-1010?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12696419#action_12696419 ]
Carsten Ziegeler commented on FELIX-1010: ----------------------------------------- > 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. Yepp, you're right of course - and I don't think that adding the dependency to the project is really a problem; it's just a difference compared to the javadoc stuff. > 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. I think RUNTIME as the retention policy is nearly a killer for this; I briefly looked at the QDox javadocs and they mention annotations. I'll have a look at it later. > >- The valueRef and nameRef attributes for properties are currently not > >supported. This is a very nice feature which allows to reference an existing > >> I 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? Ah ok, so how do I reference a constant? (I'm new to annotations...) > 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?) Yes, it's a wiki (http://cwiki.apache.org/confluence/display/FELIX) but only Felix committers have write access :) If you send a patch with plain text I can easily add it to the page. Thanks! > 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, > 090406_component_patch.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.