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.

Reply via email to