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 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.