On Fri, Jun 19, 2015 at 6:16 AM, Peter Kriens <peter.kri...@aqute.biz>
wrote:

> I got quite confused by this discussion :-( and that makes it likely that
> more people are.
>
> Original question: when to track all References?
>
> Rule 1: never. The only exception is when you’re doing something really
> special and want to bypass the type system. This implies that you’re NOT
> bound to the tracked type.
>

Great! I'm clear on this point! I will never use it!.


> Rule2: very rare, when tracking properties of the service are ok, looking
> in its bundle might also work, but annotations would not work because to
> work with the annotations you must be in the same class space for the
> annotation packages. Basically if you track all references, everything is
> an Object.
>
> That said, I think there is a bit of confusion about class space
> compatibility. The spec does not define compatibility, it defines
> *incompatibility*. Bundles are incompatible when they would see more than
> one exporter for a package taking the transitive closure of uses into
> account. So if either bundle has no import of a package, then they are by
> definition not incompatible.
>
> A: extendee
> B: extender, will call A.register(foo.Foo), imports={foo}
> C: tracker for Foo, exports={foo}
>
> a) A.imports={}, so Foo is not incompatible for A.
> b) A.imports={foo}, A, C, and B must be in the same class space for foo
>
>

So this explanation seems to indicate that there should be no with what we
attempted!

The scenario as described is EXACTLY what we are doing. However, the
tracker in C fails to track the service of A (registered by B as
A.register(foo.Foo))

It fails because equinox's FiltereServiceListener (as ServiceTracker
registers a ServiceListener) does the following:

if (allservices || ServiceRegistry.isAssignableTo(context, reference)) {
   ....
}

The call to ServiceRegistry.isAssignableTo(context, reference) fails when
context (A) does not import package of reference ("foo")

Is this a bug?



> As you should be able to see, if you just do the right thing (track only
> your visible references) things work safely out of the box and you do not
> have to do anything special.
>
> So the remaining problematic scenario is when you want handle the case
> where you have A.imports={foo} and A’s import is bound to a bundle D:
>
>
> In this case, A & B are not in the same class space so B should NOT extend
> A. This allows having multiple versions of A,B, and C. B could use A’s
> bundle to load Foo, however, now C cannot see it (X2). It could use its own
> version but then will get an error when registering it (X1). So you could
> now make C track all services but then you get Foo objects that are not Foo
> objects to you, so you need to handle them reflectively which utterly sucks
> and implies you no longer have type safety. An easier solution is then to
> not import foo, then you can see every object of the foo package.
>
> Anyway, the moment you start to try to handle these cases your code will
> balloon wildly out of proportions and become utterly unreadable. This
> rarely worth it in my opinion because if you don’t want type safety, go to
> Javascript.
>
> Kind regards,
>
> Peter Kriens
>
> On 18 jun. 2015, at 21:46, chris.g...@kiffer.be wrote:
>
> I haven't ever built a wicket extender, but I did once make a contraption
> which automagically generated a REST interface based on information in the
> target bundle.  In this case B registers servlets which will be picked up
> by C, so far so good, but these servlets result in calls to classes which
> are defined in A - to which B is not normally wired.  So B has to do some
> fancy stuff to load those packages (using A's class loader), but this does
> not imply that the servlets themselves should be registered on behalf of
> A: the servlets do not expose any of A's packages in the interfaces they
> register with C.
>
> I agree with BJ.
>
> If the wicket extender were a wicket whiteboard, rather than an extender,
> then I think we would expect it to track "wicket services" and then
> register Servlet services using its own context as a result of finding
> them. This is the same thing that lots of "adapter" bundles do.
>
> In the case of the wicket extender the only difference is how the wicket
> object is obtained. Other than that it should behave in the same way as
> the whiteboard version.
>
> Incidentally, it feels to me as if the wicket example would work better
> with a whiteboard than an extender, as it would allow downstream service
> dependencies for the wicket objects. I understand that it is only an
> example though :)
>
> Tim
>
> Sent from my iPhone
>
> On 18 Jun 2015, at 00:21, BJ Hargrave <hargr...@us.ibm.com> wrote:
>
> I think it should be B, the wicket extender,  since it is B that
> actually is wired to the servlet package and it is B which actually
> implements the Servlet. C does not implement the Servlet and does not
> import the servlet package. It just contributes implementation detail to
> the Servlet created by B.
>
> --
>
> BJ Hargrave
> Senior Technical Staff Member, IBM // office: +1 386 848 1781
> OSGi Fellow and CTO of the OSGi Alliance // mobile: +1 386 848 3788
> hargr...@us.ibm.com
>
>
> ----- Original message -----
> From: Raymond Auge <raymond.a...@liferay.com>
> Sent by: osgi-dev-boun...@mail.osgi.org
> To: OSGi Developer Mail List <osgi-dev@mail.osgi.org>
> Cc:
> Subject: Re: [osgi-dev] whiteboard pattern & extenders
> Date: Wed, Jun 17, 2015 5:54 PM
>
>
>
> On Wed, Jun 17, 2015 at 5:48 PM, BJ Hargrave <hargr...@us.ibm.com>
> wrote:
> In this case B, the Wicket extender, must import the servlet package
> since it is making Servlet objects and registering them as Servlet
> services. It must use the same servlet package as A, the whiteboard
> impl, in order for A to understand the Servlet services.
>
> Ok, that's fine. Who's bundleContext should be used to register the
> service?
>
>
> --
>
> BJ Hargrave
> Senior Technical Staff Member, IBM // office: +1 386 848 1781
> OSGi Fellow and CTO of the OSGi Alliance // mobile: +1 386 848 3788
> hargr...@us.ibm.com
>
>
> ----- Original message -----
> From: Raymond Auge <raymond.a...@liferay.com>
> Sent by: osgi-dev-boun...@mail.osgi.org
> To: OSGi Developer Mail List <osgi-dev@mail.osgi.org>
> Cc:
> Subject: Re: [osgi-dev] whiteboard pattern & extenders
> Date: Wed, Jun 17, 2015 5:20 PM
>
> Haha, I think everyone is very close! But I will try very hard to be
> really really clear to the use case:
>
> Take Apache Wicket:
>
> https://wicket.apache.org/learn/examples/helloworld.html
>
> This frame work allows a developer to implement web applications without
> ever needing to touch the Servlet API. It's more like building native
> GUI building, except that it produces HTML.
>
> Most of the time you have to bundle all the framework jars (which
> contain the servlets).
>
> However, let's imagine that now the bundle with the wicket application
> only imports the wicket APIs (no framework jars, or servlet API).
>
> Now let's consider a Wicket extender. This bundle is the "wicket
> framework". It knows about how a wicket application should be
> bootstrapped. And it provides the concrete Servlet which exposes the
> application.
>
> Now the Wicket extender just wants to use the Http Whiteboard to
> register the wicket servlets.
>
> So, you have:
>
> A) the http whiteboard
> B) the Wicket Extender
> C) the Wicket application
>
> I can repeat this example many more times for many other web frameworks.
>
> - Ray
>
> On Wed, Jun 17, 2015 at 4:52 PM, Neil Bartlett <njbartl...@gmail.com>
> wrote:
> Felix,
>
>
> On 17 Jun 2015, at 21:35, Felix Meschberger <fmesc...@adobe.com> wrote:
>
> Hi
>
>
> Am 17.06.2015 um 21:56 schrieb Neil Bartlett <njbartl...@gmail.com>:
>
> I think that B (the extender) must register the Servlet service using
> its own BundleContext, since it is the bundle that actually creates
> the Servlet objects.
>
>
> I don’t think that works in general. And I actually think it is
> wrong.
>
>
> No, I stand by it because your summary below doesn’t match up with
> what Ray actually said. At least insofar as I have understood him
> correctly.
>
>
>
> To repeat Ray’s example:
>
> (A) consumes a service, say javax.servlet.Servlet
> (B) extends packages declaring something and registering services on
> behalf of them
> (C) declare something and provide the Servlets, hence implementations
> of the javax.servlet.Servlet interface.
>
>
> Ray stated that the extended bundle C does NOT provide Servlets or know
> anything about Servlet API. It just creates these “webby
> somethings†.
>
>
>
> Now, C having the implementations implementing an interface *must* by
> definition be wired to the service interface, otherwise the
> implementations cannot be loaded by C’s class loader. And B must not
> use its own (B’s) class loader but must use C’s class loader to
> load the implementations from C and use C’s bundle context to
> register the service. B is only a messenger and B’s bundle context
> (and class loader) is never involved in this game. It cannot be
> involved. Because it will, in general, never be able to load classes
> from the extended bundle.
>
>
> B’s classloader is involved because B makes the Servlet objects that
> wrap around whatever C provides.
>
> The way I understand this, C provides some kind of bean class, which may
> be a POJO. B instantiates that class (for this it would certainly have
> to use C’s classloader). It then creates a Servlet object that wraps
> around the POJO and forwards HTTP requests to it.
>
> Thus B registers the Servlet service using its own BundleContext. It
> imports javax.servlet, and the whiteboard will only pick up those
> Servlets if they comply with the same API version.
>
>
>
>
> In any case for (A) to make normal use of the service provided by (C)
> it must wire to the same service interface as (C) is wired to. Hence
> (A) must not track all service references, hence using *false* on the
> ServiceTracker to be able to make use of the Servlet service provided
> by C (and instantiated and registered by B on behalf of C)
>
> This BTW actually *is* exactly the DS scenario, where the DS
> implementation bundle would be B. The Http Service Whiteboard
> implementation would be (A) and (C) is some bundle with a
> Service-Components header.
>
>
> Well I disagree that it’s the same, for the reasons given above. So I
> guess Ray needs to come in here to clarify again.
>
>
>
>
>
> Since the extended C bundle neither imports nor exports the Servlet
> API, *nobody* would be able to use its published Servlet services
> without doing trackAllServices=true. If you are required to turn on
> trackAllServices in your whiteboard bundle (A) then you are coupling
> that whiteboard to the implementation details of this service
> provider. All other potential consumers of your Servlet would have to
> do the same.
>
> The rule of thumb is that trackAllService is nearly always wrong
> unless you only need to inspect the metadata of a service without ever
> invoking it… for example if you are implementing a shell like Gogo.
>
>
> Agreed. There are some corner cases where trackAllServices makes sense,
> but not in general (the Apache Aries JMX Whiteboard is another such use
> case)
>
> Hope that helps more, than it confuses.
>
> Regards
> Felix
>
>
>
>
> Regards,
> Neil
>
> On 17 Jun 2015, at 20:47, Raymond Auge <raymond.a...@liferay.com>
> wrote:
>
>
> On Wed, Jun 17, 2015 at 3:38 PM, BJ Hargrave <hargr...@us.ibm.com>
> wrote:
> Well you were the one describing the scenario, I was trying to repeat
> what I thought you were saying :-)
>
> So C is a bundle which does not have any implementation of Servlet
> and does not import the servlet package and B will register a Servlet
> service, using C's bundle context, with some object implementing
> Servlet and B does not import the servlet package.
>
> How does B get an object implementing Servlet to register as the
> service since it has no wiring to any package containing Servlet?
>
> I never said that B doesn't know about Servlet... In fact I said
> exactly that B knows about making Servlets.
>
> It seems odd that neither B or C is wired to the servlet package, yet
> they conspire to register a Servlet service.
>
> B should certainly be wired to the servlet package... and the same
> one as the whiteboard.
>
> Let me try to clarify with a concrete example.
>
> There are many "webby" technologies in existence which remove the
> need for a developer to have any knowledge of Servlet API. These
> technologies use things like annotations or even simply pure
> packaging conventions for describing their application.
>
> However, in the end, you need a servlet. Typically some framework
> looks at the packaging convention and then reacts to that by creating
> a Servlet which turns the convention into something concrete.
>
> In this scenario the original "bundle" doesn't know anything about
> Servlet... BUT there is certainly a "concrete" servlet implementation
> somewhere that knows about the convention.
>
> However, this concrete thing (the extender) wants to use the
> whiteboard instead of handling all the HTTP stuff itself.
>
> the whiteboard knows nothing about this extender.
>
>
>
>
> --
>
> BJ Hargrave
> Senior Technical Staff Member, IBM // office: +1 386 848 1781
> OSGi Fellow and CTO of the OSGi Alliance // mobile: +1 386 848 3788
> hargr...@us.ibm.com
>
>
> ----- Original message -----
> From: Raymond Auge <raymond.a...@liferay.com>
> Sent by: osgi-dev-boun...@mail.osgi.org
> To: OSGi Developer Mail List <osgi-dev@mail.osgi.org>
> Cc:
> Subject: Re: [osgi-dev] whiteboard pattern & extenders
> Date: Wed, Jun 17, 2015 3:32 PM
>
> Actually Chris is correct in describing the scenario and BJ you are
> not correct.
>
> C) is some bundle which has a header "ImCool: oh so cool!"
> B) is an extender which makes servlets from the header "ImCool" IT
> knows how to make a Servlet service.
> A) is the whiteboard
>
>
> This doesn't work because C) does not import Servlet.
>
> - Ray
>
> On Wed, Jun 17, 2015 at 3:24 PM, BJ Hargrave <hargr...@us.ibm.com>
> wrote:
> OK.
>
> So A, the whiteboard impl, has ServiceTrackers and must care about
> the specific package.
>
> B is the extends which registers the services. It has no
> ServiceTrackers and does not care about the package since it does not
> use the package itself.
>
> C also must care about the same package as A (so they are type
> compatible).
>
> So there is not bundle which both is the extender and registers the
> services and also has ServiceTrackers which must care about the
> specific package. Therefore trackAllServices=true is not needed.
>
> --
>
> BJ Hargrave
> Senior Technical Staff Member, IBM // office: +1 386 848 1781
> OSGi Fellow and CTO of the OSGi Alliance // mobile: +1 386 848 3788
> hargr...@us.ibm.com
>
>
> ----- Original message -----
> From: Raymond Auge <raymond.a...@liferay.com>
> Sent by: osgi-dev-boun...@mail.osgi.org
> To: OSGi Developer Mail List <osgi-dev@mail.osgi.org>
> Cc:
> Subject: Re: [osgi-dev] whiteboard pattern & extenders
> Date: Wed, Jun 17, 2015 2:55 PM
>
>
>
> On Wed, Jun 17, 2015 at 2:44 PM, BJ Hargrave <hargr...@us.ibm.com>
> wrote:
> So this is like DS (an extender) registering Servlet services on
> behalf of a bundle using DS. Then of course the extender bundle does
> not care about the servlet package but also the extender bundle is
> not using ServiceTrackers to track the Servlet services. That is done
> by the Http Whiteboard impl bundle which does care about the servlet
> package and its version.
>
> I'm sorry but you've lost me, and DS isn't an example of the scenario
> because the DS bundle is itself tracker in this scenario.
>
> In the scenario I'm describing there are 3 bundles in play:
>
> A) the whiteboard bundle (has the trackers)
> B) an extender which registers services that the whiteboard
> C) a bundle which is being extended by B) but doesn't know anything
> about A) or the API it's being extended with
>
> Sincerely,
> - Ray
>
>
> --
>
> BJ Hargrave
> Senior Technical Staff Member, IBM office: +1 386 848 1781
> OSGi Fellow and CTO of the OSGi Alliance mobile: +1 386 848 3788
> hargr...@us.ibm.com
>
>
> ----- Original message -----
> From: Raymond Auge <raymond.a...@liferay.com>
> Sent by: osgi-dev-boun...@mail.osgi.org
> To: OSGi Developer Mail List <osgi-dev@mail.osgi.org>
> Cc:
> Subject: Re: [osgi-dev] whiteboard pattern & extenders
> Date: Wed, Jun 17, 2015 2:23 PM
>
> But an extender who registers services to a whiteboard impl on behalf
> of extendee will result in those services not being visible to the
> whiteboard if the extendee does not import the packages used by the
> services?
>
> On Wed, Jun 17, 2015 at 2:16 PM, BJ Hargrave <hargr...@us.ibm.com>
> wrote:
> Well whiteboard and extenders are different.
>
> Whiteboard should not use true since it cares about the specific API
> package version.
>
> Extenders should use BundleTrackers rather than ServiceTrackers since
> they are not using whiteboard services.
>
> --
>
> BJ Hargrave
> Senior Technical Staff Member, IBM office: +1 386 848 1781
> OSGi Fellow and CTO of the OSGi Alliance mobile: +1 386 848 3788
> hargr...@us.ibm.com
>
>
> ----- Original message -----
> From: Raymond Auge <raymond.a...@liferay.com>
> Sent by: osgi-dev-boun...@mail.osgi.org
> To: OSGi Developer Mail List <osgi-dev@mail.osgi.org>
> Cc:
> Subject: [osgi-dev] whiteboard pattern & extenders
> Date: Wed, Jun 17, 2015 2:12 PM
>
> When implementing a whiteboard pattern should we always open trackers
> using the trackAllServices = true ? via:
>
> ServiceTracker.open(true);
>
> It would seem that this is the only way that we can support extenders
> where the extendee has no knowledge of the APIs in question, correct?
>
> --
> 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
>
>
>
> --
> 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
>
>
>
> --
> 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
>
>
>
> --
> 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
>
>
>
> --
> 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
>
>
> _______________________________________________
> 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
>
>
>
> --
> 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
>
>
>
> _______________________________________________
> 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
>



-- 
*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)
_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to