Thanks a lot for this quick, in-depth answers :)

2017-09-28 10:01 GMT+02:00 Thomas Driessen <thomas.driessen...@gmail.com>:

>
> ---------- Forwarded message ----------
> From: Timothy Ward <tim.w...@paremus.com>
> Date: 2017-09-27 16:05 GMT+02:00
> Subject: Re: [osgi-dev] Some questions
> To: OSGi Developer Mail List <osgi-dev@mail.osgi.org>
> Cc: Thomas Driessen <thomas.driessen...@gmail.com>
>
>
> Some more responses inline:
>
> On 27 Sep 2017, at 14:29, Neil Bartlett <njbartl...@gmail.com> wrote:
>
>
> On 27 Sep 2017, at 14:14, Thomas Driessen <thomas.driessen...@gmail.com>
> wrote:
>
> Hi,
>
> after working for some time with OSGi now I have a bunch of questions that
> I couldn't find a satisfying answer for yet. Maybe some of you can help me
> to clarify those:
>
> 1) Why is OSGi using annotations as configuration objects?
>
>
> Two reasons:
> 1. Annotation fields can have defaults specified directly.
> 2. Annotation types are limited to primitives, Strings (and arrays
> thereof) which map neatly to the kinds of data that can be represented in
> config files.
>
>
>    - It is really strange that within an @Activate method the
>    annotation-config object is null but I still can call the methods defined
>    on it.
>
> The default toString of the Felix SCR configuration proxies used to be
> null. This proved very confusing in the debugger, and I believe that it has
> been changed in recent releases.
>
>
>    - Wouldn't DTOs be the better choice? Maybe in combination with an
>    annotation and annotation processor that assures the DTO consists only of
>    primitives, arrays of primitives or other DTOs. Configuration values like “
>    component.name" could be represented as values of a ConfigurationDTO
>    containing a ComponentDTO which has a name variable.
>
> DTOs don’t give a good way of providing defaults, and they encourage
> people to believe that the configurations can contain rich types (you
> mention your DTO containing DTOs). Configuration Admin configurations are
> flat, and Annotations give a really good mapping for them. The decision was
> therefore to use the type which is well suited, rather than building a lot
> of infrastructure to restrict a type which isn’t.
>
> 2) Why are the OSGi DS annotations RetentionPolicy.CLASS?
>
>
>
> Because runtime retention would create a runtime dependency, i.e. an
> Import-Package for the annotation type package. That in turn would prevent
> resolution of a bundle if the annotations were not present at runtime.
>
>
> Also the annotations are not used by the Service Component Runtime, only
> the XML is used. Having runtime retention would confuse what is otherwise a
> clear statement about the source of truth.
>
>
>
>    - Sometimes it would be nice to find the annotated methods/fields at
>    runtime, e.g. at testing in a non-OSGi environment
>
> You could just read the XML descriptor - it has a well defined schema.
>
> 3) Why are the OSGi DS annotations not inherited?
>
>
>
> You might be using bnd (or an alternative tool) to process the class files
> of a bundle after the Java source has been compiled. When doing this it is
> not necessary to have the superclasses visible, and so bnd would not know
> about inherited annotations. So if bnd looks for inherited annotations when
> available, it could produce different results depending on how it is
> invoked.
>
> In practice, most people use a tool like Bndtools or bnd-maven-plugin
> which puts the same JARs on the bnd classpath that were used for
> compilation, and you obviously DO need superclasses visible for
> compilation, so you can just turn on the option to use inheritance.
>
>
>    - I know that there is a option in bnd for this, but I’m not sure if
>    or when it is save to use this option, as I'm not really sure about the
>    implications this might have.
>
> This option is safe if all of the class hierarchy is contained within a
> single bundle. It is not safe if the inheritance tree spans different
> bundles. The annotations are processed at build time based on the
> compilation class path but the runtime behaviour is determined by the way
> in which your bundles wire in the OSGi framework. Obviously if your bundle
> wires differently at runtime then the generated XML may be broken (for
> example if an injected private field is renamed between micro versions).
>
>
>    - Are there any best practices/patterns for the cases where I have
>    mutliple implementations of one service and all of them share code that
>    should be called e.g. during activation or deactivation?
>
> Good unit tests are usually enough, but JavaDoc and an abstract method
> which forces the subclasses to implement an activate/deactivate method can
> help.
>
>
> Any explanation is appreciated :)
>
> Kind regards,
> Thomas
> _______________________________________________
> OSGi Developer Mail List
> osgi-dev@mail.osgi.org
> https://mail.osgi.org/mailman/listinfo/osgi-dev
>
>
> _______________________________________________
> OSGi Developer Mail List
> osgi-dev@mail.osgi.org
> https://mail.osgi.org/mailman/listinfo/osgi-dev
>
>
>
>
_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to