As a ZK user I"m gonna start to be jealous ;)

Alain


On Tue, Feb 12, 2019 at 4:21 PM Thomas Driessen via osgi-dev <
osgi-dev@mail.osgi.org> wrote:

> Hi Todor,
>
> thank you so much for your detailed explanation and the additional links.
> That helped me a lot to simplify my implementation for Vaadin.
>
> Hopefully this will lead to a seamless integration between Vaadin and OSGi.
>
> Kind regards,
> Thomas
>
> Am Di., 12. Feb. 2019 um 11:05 Uhr schrieb Boev, Todor <
> todor.b...@softwareag.com>:
>
>> Hi Thomas,
>>
>> A better design would be to implement a whiteboard pattern rather than an
>> extender.
>> Rather than to track and scan bundles it is better to track OSGi services
>> that extend Component and
>> plug those into Vaadin directly.
>>
>> To make sure Vaadin gets a fresh object every time it needs you can
>> recommend to your users to
>> register their services with a property "service.scope=prototype". This
>> property instructs the OSGi
>> framework to create a new object every time an attempt is made to grab
>> the service. Your
>> OSGiInstantiator will then just grab the service every time it is asked
>> to create an object.
>> The users may still choose to use a singleton object if it is stateless
>> for example.
>>
>> In this design you abstract away how the users choose to create and
>> register their service.
>> In the case when they choose Declarative Services they will create a
>> regular DS component
>> with "service.scope=prototype". No need of a component factory.
>>
>> The OSGiInstantiator has to hold on to objects of this type:
>>
>> https://osgi.org/javadoc/osgi.core/7.0.0/org/osgi/framework/ServiceObjects.html
>> Which are obtained like this:
>>
>>
>> https://osgi.org/javadoc/osgi.core/7.0.0/org/osgi/framework/BundleContext.html#getServiceObjects-org.osgi.framework.ServiceReference
>> -
>> It has to store the service instances it creates and release them when
>> appropriate.
>>
>> The principles of this design are tried and tested in OSGi specifications
>> like the
>> Http integration - where the core gathers Servlet and Filter services or
>> the JAX-RS integration
>> where the core gathers resources.
>>
>> In my opinion the major technical issues you face are:
>> 1. You likely have to pass to Vaadin all classes that it needs to plug
>> into the web app ahead of
>> time. This means you need to inspect each Component service when it
>> arrives to get it's concrete
>> class. Basically probe the service by getting one instance then getting
>> it's class then releasing
>> the instance. Then you may need to reboot the Vaadin application with the
>> new class added.
>>
>> 2. The OSGiInstantiator is created through ServiceLoader. This means you
>> can not initialize it with
>> the concrete OSGi service object. It may have to pass through static
>> fields that are populated with
>> the Component services by other parts of your whiteboard. This can also
>> introduce lifecycle issues
>> since the OSGiIntantiator may be created before a service it needs is
>> added so it may need to block
>> for a period of time. If you can pass a ready made OSGiInstantiator to
>> Vaadin it will be ideal.
>>
>> These implementation complications are well worth the power/simplicity
>> you give the users to
>> completely control the lifecycle and implementation style of their
>> components.
>>
>>
>> P.S. With all that said I think there is a real issue with DS and
>> programmatic creation of
>> components. Since component factories are frowned upon the next best
>> thing is to register
>> "service.scope=prototype" services that may need setters or initializtion
>> methods. The party
>> that needs to make programmatically the component can grab a fresh
>> instance and the customize it.
>> Another pattern I have used is to just add configurations to ConfigAdmin.
>>
>> Hope this helps,
>> Todor
>>
>>
>> On Mon, 2019-02-11 at 09:12 +0000, Thomas Driessen via osgi-dev wrote:
>> > Hi Ray,
>> >
>> > thanks for your time and advice.
>> >
>> > Regarding your question:
>> >
>> > The classes are annotated by whoever wants to register a @Route in
>> Vaadin. Routes in Vaadin are
>> > usually a specific location within a web application. Classes that are
>> annotated with @Route are
>> > extending Vaadin's Component class and are instantiated by Vaadin
>> whenever a new client requests
>> > the respective part of the web application. Vaadin delegates the
>> instantiation of the class to an
>> > Instantiator,  this is usually the DefaultInstantiator class in Vaadin.
>> >
>> > I try to delegate this instantiation to OSGi by extending Vaadins
>> DefaultInstantiator and
>> > registering the new OSGiInstantiator via ServiceLoader mechanism which
>> is internally used by
>> > Vaadin to find its Instantiators.
>> > Whenever Vaadin calls an Instantiator it passes a class that has to be
>> instantiated.
>> > This is the place where I'm using ComponentFactory to create instances
>> of those classes.
>> >
>> > You can also have a look on all of these classes and additional
>> information about the intended
>> > logic flow at my repository:
>> > https://github.com/Sandared/flow-osgi
>> >
>> > Kind regards,
>> > Thomas
>> >
>> >
>> > ------ Originalnachricht ------
>> > Von: "Raymond Auge" <raymond.a...@liferay.com>
>> > An: "Thomas Driessen" <thomas.driessen...@gmail.com>
>> > Cc: "OSGi Developer Mail List" <osgi-dev@mail.osgi.org>
>> > Gesendet: 10.02.2019 18:05:56
>> > Betreff: Re: [osgi-dev] Programmatically creating DS components
>> >
>> > >
>> > > On Sun, Feb 10, 2019 at 11:20 AM Thomas Driessen <
>> thomas.driessen...@gmail.com> wrote:
>> > > > Hi Ray,
>> > > >
>> > > > I'm not defining any additional manifest header if that's what you
>> mean. I have no real
>> > > > control over the bundles I need to scan.
>> > > >
>> > > > What I do is registering a BundleTracker that scans a bundle's
>> classes if its wiring states it
>> > > > is importing the package of the annotation I'm looking for.
>> > > > (Can be seen here:
>> > > >
>> https://github.com/Sandared/flow-osgi/blob/master/flow.osgi.integration/src/main/java/io/jatoms/flow/osgi/integration/FlowOsgiRouteTracker.java
>> > > > )
>> > > >
>> > >
>> > > This is precisely the "extender pattern" [1].
>> > >
>> > > > Those classes usually look something like this:
>> > > >
>> > > > @Route("")
>> > > > @Component(factory="fqcn")
>> > > > public class MyFancyUI extends Component {
>> > > >   @Reference
>> > > >    SomeService service;
>> > > >   ...
>> > > > }
>> > > >
>> > > > So I'm looking into the wiring of the bundle if it has imported the
>> package
>> > > > "com.vaadin.flow.router" . If so I then scan the bundle's classes
>> for the @Route annotation
>> > > > (and @RouteAlias).
>> > > > Classes that have this annotation can later on be instantiated via
>> ComponentFactory.
>> > > >
>> > > > Can I instantiate such a component with the Apache Aries approach
>> and if so will its reference
>> > > > be injected? I'm not sure if this is done if I'm registering the
>> instance just as a service.
>> > > >
>> > >
>> > > Let's start with how the classes came to be annotated with
>> @Component, and why that isn't
>> > > already enough.
>> > >
>> > > - Ray
>> > >
>> > > [1] https://blog.osgi.org/2007/02/osgi-extender-model.html
>> > >
>> > > > Kind regards,
>> > > > Thomas
>> > > >
>> > > > Am So., 10. Feb. 2019 um 15:38 Uhr schrieb Raymond Auge <
>> raymond.a...@liferay.com>:
>> > > > > Are you implementing this using the extender pattern? If so, I
>> would not use DS. I would use
>> > > > > something lower level.
>> > > > >
>> > > > > There are plenty of good alternatives for doing this, but I would
>> suggest looking at Apache
>> > > > > Aries Component DSL [1] (it's what is used to implement Aries
>> JAXRS Whiteboard).
>> > > > >
>> > > > > - Ray
>> > > > >
>> > > > > [1] https://github.com/apache/aries/tree/trunk/component-dsl
>> > > > >
>> > > > > On Sun, Feb 10, 2019 at 8:01 AM Thomas Driessen via osgi-dev <
>> osgi-dev@mail.osgi.org> wrote:
>> > > > > > Hi,
>> > > > > >
>> > > > > > I'm currently trying to sketch out a possible better OSGi
>> integration for Vaadin 10+.
>> > > > > >
>> > > > > > For this I need to programmatically create DS components in
>> order to make @
>> > > > > > Route/@RouteAlias annotated classes also DS components.
>> > > > > >
>> > > > > > Right now I'm doing this via ComponentFactory and the
>> assumption that all @Route annotated
>> > > > > > classes are also annotated with
>> > > > > > @Component(factory="fully qualified class name")
>> > > > > >
>> > > > > > I don't think this is the best way to do this. Having to type
>> the fqcn seems rather
>> > > > > > errorprone to me and therefore I wanted to ask if there is a
>> better way (maybe even a
>> > > > > > typesafe way) to do this?
>> > > > > >
>> > > > > > The code instantiating a component can be seen here:
>> > > > > >
>> https://github.com/Sandared/flow-osgi/blob/master/flow.osgi.integration/src/main/java/io/jatoms/flow/osgi/integration/FlowOsgiInstantiator.java
>> > > > > > The class that shall be instantiated can be seen here:
>> > > > > >
>> https://github.com/Sandared/flow-osgi/blob/master/flow.osgi.simpleui/src/main/java/io/jatoms/flow/osgi/simpleui/MainView.java
>> > > > > >
>> > > > > > Any advice is highly appreciated.
>> > > > > >
>> > > > > > Kind regards,
>> > > > > > Thomas
>> > > > > > _______________________________________________
>> > > > > > OSGi Developer Mail List
>> > > > > > osgi-dev@mail.osgi.org
>> > > > > > https://mail.osgi.org/mailman/listinfo/osgi-dev
>> > > > >
>> > > > >
>> > > > > --
>> > > > > Raymond Augé (@rotty3000)
>> > > > > Senior Software Architect Liferay, Inc. (@Liferay)
>> > > > > Board Member & EEG Co-Chair, OSGi Alliance (@OSGiAlliance)
>> > >
>> > >
>> > > _______________________________________________
>> > > 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