Raymond,
I agree with Carsten, you can use ConfigurationAdmin to ensure that a
target service is properly wired.

In my case all components instances are being created by my central
service. So, all components requires a configuration instance in order to
be activated.

@Component(enabled = true,
>         configurationPid = Constants.BSDS_PID,
>         configurationPolicy = ConfigurationPolicy.REQUIRE)
>


and then I set the target using this syntax:

InterfaceFactoryForTesting.target=(p.color=blue)
>


2015-03-09 12:07 GMT-03:00 Raymond Auge <[email protected]>:

> Allow me to demonstrate using a real world scenario we have right now.
>
> There is an API comprised of at least two parts - Foo & Fum
>
> There are many implementations of Foo and Fum coming from many bundles
>
> However, the typical case is also that a Foo impl uses it's own Fum impl.
>
> So, your first attempt looks like this:
>
> @Component(service = Fum.class)
> public class MyFum implements Fum { }
>
> @Component(service = Foo.class)
> public class MyFoo implements Foo {
>    @Reference
>    public void setFum(Fum fum) {..}
> }
>
> Now this can break, because there are many Fums, right?
>
> So I need to be more specific. At the moment I have to do an ugly hack
> which is export the Fum by also it's FumImpl type:
>
> @Component(service = {Fum.class, MuFum.class})
> public class MyFum implements Fum { }
>
> and now in the Foo impl, I need to change to either:
>
> @Component(service = Foo.class)
> public class MyFoo implements Foo {
>    @Reference(service = MyFum.class)
>    public void setFum(Fum fum) {..}
> }
>
> OR
>
> @Component(service = Foo.class)
> public class MyFoo implements Foo {
>    @Reference(target = "(objectClass=MyFum)")
>    public void setFum(Fum fum) {..}
> }
>
> all of that is really crappy!
>
> Why do I need to expose the internal details just so I can connect two
> Components together with such crud information.
>
> Why can't I simply do this:
>
> @Component(service = Fum.class)
> public class MyFum implements Fum { }
>
> @Component(service = Foo.class)
> public class MyFoo implements Foo {
>    @Reference(target = "(service.bundleid=${bundle.id})")
>    public void setFum(Fum fum) {..}
> }
>
> There! problem solved!
>
> R6 added a few very nice service properties like service.bundleid but they
> are completely useless because I CAN'T use them realistically because that
> information is runtime only and you can't know about it ahead of time.
>
>
>
> On Mon, Mar 9, 2015 at 10:51 AM, Raymond Auge <[email protected]>
> wrote:
>
> >
> >
> > On Mon, Mar 9, 2015 at 10:29 AM, Carsten Ziegeler <[email protected]>
> > wrote:
> >
> >> Am 09.03.15 um 15:08 schrieb Raymond Auge:
> >>
> >> >
> >> > This also isn't the goal. The goal is to automate/simplify parts which
> >> you
> >> > don't want to handle via configuration. For instance you would never
> use
> >> > the bundle.id because that would be foolish since uninstall and
> >> reinstall
> >> > would make the configuration invalid.
> >> >
> >> > However, there are many details for which it might be useful to be
> able
> >> to
> >> > apply filters on, but due to their dynamic nature its impractical to
> use
> >> > them because you must hard code the values currently. This is true for
> >> > almost all details of a bundle at runtime.
> >> >
> >> > It's also true that some information you don't want to duplicate. For
> >> > instance, anything that is in the manifest you probably want to keep
> >> > centralized there, and not require a developer to duplicate it since
> >> this
> >> > causes a change management problem.
> >> >
> >> > So, my thought about where the information for replacement is that it
> >> would
> >> > come from only
> >> > - bundle runtime info
> >>
> >> What exactly do you mean with that?
> >>
> >> > - manifest
> >>
> >> How is this different from a properties file in the bundle?
> >>
> >
> > It's most often calculated during the build and you can't really see the
> > result until the bundle is running.
> >
> >
> >>
> >> Regards
> >> Carsten
> >> --
> >> Carsten Ziegeler
> >> Adobe Research Switzerland
> >> [email protected]
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: [email protected]
> >> For additional commands, e-mail: [email protected]
> >>
> >>
> >
> >
> > --
> > *Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile>
> >  (@rotty3000)
> > Senior Software Architect *Liferay, Inc.* <http://www.liferay.com>
> >  (@Liferay)
> > Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org>
> > (@OSGiAlliance)
> >
>
>
>
> --
> *Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile>
>  (@rotty3000)
> Senior Software Architect *Liferay, Inc.* <http://www.liferay.com>
>  (@Liferay)
> Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org>
> (@OSGiAlliance)
>



-- 
"Tudo vale a pena se a alma não é pequena..."

Reply via email to