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.