You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Serge Huber (JIRA)" <ji...@apache.org> on 2013/10/28 11:13:31 UTC

[jira] [Updated] (FELIX-4296) Cannot deactivate service interface detection in DS annotations

     [ https://issues.apache.org/jira/browse/FELIX-4296?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Serge Huber updated FELIX-4296:
-------------------------------

    Description: 
I am trying to use DS annotations to declare an extender, and I have the following annotation and class definition in order to prevent declaring a service with a SynchronousBundleListener interface : 

@Component(service={})
public class ExtenderBundleListener implements SynchronousBundleListener {

According to the DS annotation specification this is value, as is illustrated from the javadoc :

	/**
	 * The types under which to register this Component as a service.
	 *
	 * <p>
	 * If no service should be registered, the empty value
	 * <code>&#x7B;&#x7D;</code> must be specified.
	 *
	 * <p>
	 * If not specified, the service types for this Component are all the
	 * <i>directly</i> implemented interfaces of the class being annotated.
	 *
	 * @see "The service element of a Component Description."
	 */
	Class< ? >[] service() default {};

Unfortunately this doesn't work, as it seems that the annotation parser transforms the {} value into "null" so the following code in the DS annotation processor doesn't work as expected : 

        final List<String> listedInterfaces = new ArrayList<String>();
        if (cad.getValue("service") != null) {
            final String[] interfaces = (String[]) cad.getValue("service");
            for (final String t : interfaces) {
                listedInterfaces.add(t);
            }
        } else {
            // scan directly implemented interfaces
            this.searchInterfaces(listedInterfaces, scannedClass.getScannedClass());
        }

This is a bit problematic to solve because we would need to differentiate between the null and empty case, but it seems that this is somehow not supported by the annotations parser ?

For the moment I worked around the problem by using the following annotation, but it's rather ugly since it still generates a service that is not needed :

@Component(service={ExtenderBundleListener.class}, immediate = true) // ideally we would like to not specify any service but it's seems that due to a bug in the DS annotation processor this is not possible so we use the immediate setting instead
public class ExtenderBundleListener implements SynchronousBundleListener {


  was:
I am trying to use DS annotations to declare an extender, and I have the following annotation and class definition : 

@Component(service={})
public class ExtenderBundleListener implements SynchronousBundleListener {

According to the DS annotation specification this is value, as is illustrated from the javadoc :

	/**
	 * The types under which to register this Component as a service.
	 *
	 * <p>
	 * If no service should be registered, the empty value
	 * <code>&#x7B;&#x7D;</code> must be specified.
	 *
	 * <p>
	 * If not specified, the service types for this Component are all the
	 * <i>directly</i> implemented interfaces of the class being annotated.
	 *
	 * @see "The service element of a Component Description."
	 */
	Class< ? >[] service() default {};

Unfortunately this doesn't work, as it seems that the annotation parser transforms the {} value into "null" so the following code in the DS annotation processor doesn't work as expected : 

        final List<String> listedInterfaces = new ArrayList<String>();
        if (cad.getValue("service") != null) {
            final String[] interfaces = (String[]) cad.getValue("service");
            for (final String t : interfaces) {
                listedInterfaces.add(t);
            }
        } else {
            // scan directly implemented interfaces
            this.searchInterfaces(listedInterfaces, scannedClass.getScannedClass());
        }

This is a bit problematic to solve because we would need to differentiate between the null and empty case, but it seems that this is somehow not supported by the annotations parser ?

For the moment I worked around the problem by using the following annotation, but it's rather ugly since it still generates a service that is not needed :

@Component(service={ExtenderBundleListener.class}, immediate = true) // ideally we would like to not specify any service but it's seems that due to a bug in the DS annotation processor this is not possible so we use the immediate setting instead
public class ExtenderBundleListener implements SynchronousBundleListener {



> Cannot deactivate service interface detection in DS annotations
> ---------------------------------------------------------------
>
>                 Key: FELIX-4296
>                 URL: https://issues.apache.org/jira/browse/FELIX-4296
>             Project: Felix
>          Issue Type: Bug
>          Components: SCR Annotations
>    Affects Versions: scr ds annotations 1.2.4
>            Reporter: Serge Huber
>
> I am trying to use DS annotations to declare an extender, and I have the following annotation and class definition in order to prevent declaring a service with a SynchronousBundleListener interface : 
> @Component(service={})
> public class ExtenderBundleListener implements SynchronousBundleListener {
> According to the DS annotation specification this is value, as is illustrated from the javadoc :
> 	/**
> 	 * The types under which to register this Component as a service.
> 	 *
> 	 * <p>
> 	 * If no service should be registered, the empty value
> 	 * <code>&#x7B;&#x7D;</code> must be specified.
> 	 *
> 	 * <p>
> 	 * If not specified, the service types for this Component are all the
> 	 * <i>directly</i> implemented interfaces of the class being annotated.
> 	 *
> 	 * @see "The service element of a Component Description."
> 	 */
> 	Class< ? >[] service() default {};
> Unfortunately this doesn't work, as it seems that the annotation parser transforms the {} value into "null" so the following code in the DS annotation processor doesn't work as expected : 
>         final List<String> listedInterfaces = new ArrayList<String>();
>         if (cad.getValue("service") != null) {
>             final String[] interfaces = (String[]) cad.getValue("service");
>             for (final String t : interfaces) {
>                 listedInterfaces.add(t);
>             }
>         } else {
>             // scan directly implemented interfaces
>             this.searchInterfaces(listedInterfaces, scannedClass.getScannedClass());
>         }
> This is a bit problematic to solve because we would need to differentiate between the null and empty case, but it seems that this is somehow not supported by the annotations parser ?
> For the moment I worked around the problem by using the following annotation, but it's rather ugly since it still generates a service that is not needed :
> @Component(service={ExtenderBundleListener.class}, immediate = true) // ideally we would like to not specify any service but it's seems that due to a bug in the DS annotation processor this is not possible so we use the immediate setting instead
> public class ExtenderBundleListener implements SynchronousBundleListener {



--
This message was sent by Atlassian JIRA
(v6.1#6144)