Is RSA a special case then? - Ray
On Mon, May 25, 2015 at 9:50 AM, Richard S. Hall <he...@ungoverned.org> wrote: > Overall, I agree...we should probably add some of this argumentation to > our FAQ entry... > > -> richard > > > On 5/25/15 03:38 , Peter Kriens wrote: > >> This kind of reasoning is often caused by not seeing the extremely tight >> relation between the provider of an API and that API itself. There is >> virtually no backward compatibility for providers, if the API changes, you >> need a new provider. Separating the provider from its API therefore just >> creates a lot of work and potential error cases that provide no benefit >> whatsoever. >> >> The best practice I learned over time is therefore is that a provider >> includes an exact copy of the API package that it is build against and both >> exports AND imports it. Since OSGi packages have a globally unique name + >> version this works, the framework will share one of the exported packages >> if possible. This model has a number of advantages: >> >> 1) The resolver can automatically drag in implementations based on the API >> 2) You have significantly fewer bundles to worry about >> 3) You always have the right version at hand >> 4) bnd supports this model very well with its package include from class >> path function and calculation of importing exports. >> >> Every time I run into bundles that do not include their API I get this >> desperate sinking feeling :-( >> >> The idea that it works better with multiple providers of the same API is >> nonsense since they both MUST use the identical versions of the overlapping >> packages. That is, there is no backward compatibility to speak of for >> providers. So substitutable imports work fine for this use case. >> >> The only argument for separating API and implementation in two bundles is >> that you do not have to refresh the client if you update an implementation. >> True, but due to transitive dependencies it takes real hard work to >> actually achieve this unless you have a small trivial system. And an OSGi >> system that can handle the going down of any bundle is likely not very >> valuable since it will likely fail. So realistically, this argument sounds >> nice in theory but has very little value in practice. >> >> Interestingly, this discussion was held early on and several times >> thereafter. Initially, I was not sure, the separate API bundle did not >> sound so bad. Now, 15 years later I am quite convinced that the provider >> including the API is the best solution in most cases. >> >> Kind regards, >> >> Peter Kriens >> >> >> >> On 20 mei 2015, at 17:37, Milen Dyankov <milendyan...@gmail.com> wrote: >>> >>> Well I agree in general. My only point is that IMHO the one defining the >>> API should also be the one providing it at runtime. Since OSGi alliance >>> is >>> defining a spec which describes a service API it should be the one >>> providing the API bundle. Vendors are still free to provide their own >>> implementations and extensions anyway they wish. But this way a random >>> consumer does not have to investigate if given vendor has included the >>> API >>> in the implementation and if not then worry about which bundles need to >>> be >>> installed at runtime to satisfy imports. I personally (as probably most >>> people on this list) can deal with it. And from that perspective it's >>> easy >>> (and partly true) to say it's not rally a problem. However it doesn't >>> look >>> nice and it does not help to fight the "too complex" and "too messy" >>> stereotypes. >>> Just my 2 cents! >>> >>> Best, >>> Milen >>> >>> >>> On Wed, May 20, 2015 at 3:55 PM, Richard S. Hall <he...@ungoverned.org> >>> wrote: >>> >>> On 5/20/15 05:15 , Milen Dyankov wrote: >>>> >>>> Thanks for your answer Richard! >>>>> >>>>> I am aware if the FAQ however what it basically tells you is "it >>>>> depends" >>>>> ;) >>>>> >>>>> Unfortunately, it does depend on your circumstances. There are very >>>> few >>>> cases in software engineering where you can say, "always do it like >>>> this"...that's the way the cookie crumbles. >>>> >>>> Thus I was hoping for some more insides so I can better understand the >>>> >>>>> intentions and the situation with service APIs from OSGi specs as of >>>>> today. >>>>> So, if I understand your answer correctly the conclusions are: >>>>> >>>>> - Never use compendium bundle at runtime because it is not a proper >>>>> bundle >>>>> (whatever that means). >>>>> >>>>> Bundles (i.e., modules) are supposed to be cohesive and loosely >>>> coupled. >>>> The compendium is just a bunch of APIs thrown into a JAR file, so that >>>> hardly is cohesive and certainly wouldn't lead to low coupling. >>>> Understand? >>>> >>>> I agree with you that this should be in FAQ at >>>> >>>>> least. It would be even better if there is some more official statement >>>>> (may be there is and I just couldn't find it) that also explains why! >>>>> >>>>> - There are no proper/official separate API bundles for the service >>>>> APIs >>>>> defined in the specs. Vendors are free to choose if they (1) package >>>>> the >>>>> API in the implementation bundle, (2) provide the implementation only >>>>> or >>>>> (3) provide separate bundles for API and implementation. Felix has >>>>> chosen >>>>> the first approach to avoid maintaining too many bundles. >>>>> >>>>> No choice has been made at Apache Felix, but generally people have >>>> gravitated to that approach. Subprojects are free to do it any way they >>>> want, because use cases vary. >>>> >>>> IMHO >>>> >>>>> and according to the FAQ it seems the third approach makes more sense: >>>>> "*This >>>>> situation would be different if the service API were package in a >>>>> separate >>>>> bundle. In this situation, all consumer bundles would be wired to the >>>>> API >>>>> bundle, not to the provider bundle. Thus, if the provider were updated >>>>> or >>>>> uninstalled and then refreshed, the consumer bundles would only be >>>>> minimally impacted (i.e., they would either switch to the new version >>>>> of >>>>> the provider or to a different provider).*" but I respect your >>>>> decisions. >>>>> >>>>> It does make a lot of sense in many cases. If you are unsure of your >>>> needs, I'd recommend this as the default approach. >>>> >>>> >>>> - There is no issue with split packages >>>>> <http://wiki.osgi.org/wiki/Split_Packages> because regardless of the >>>>> provider and the way APIs they are packaged/exported the API package(s) >>>>> *should* always be both complete and limited to what what OSGi alliance >>>>> has >>>>> specified. IMHO this should be a bit more strict than just expecting >>>>> vendors to "do it right". Then perhaps consumers can feel a bit more >>>>> safe >>>>> from such issues when choosing an implementation (without the need to >>>>> examine it's internals). But I'm not going to argue about it. >>>>> >>>>> There is not much that can be done about this. What do you want the >>>> OSGi >>>> Alliance to do? We could require that ever developer give a signed list >>>> of >>>> every class that should be in every package and store that in some >>>> central >>>> repository. Then any time a bundle says they export a particular class, >>>> the >>>> framework could go out to that authority get the list of classes for >>>> that >>>> package and scan the bundle to make sure it contains the proper >>>> classes. Of >>>> course, this wouldn't even guarantee anything, since the bundle could >>>> include bogus implementation classes. Nor could you make it better by >>>> including class signatures in this central repository, because that >>>> would >>>> eliminate substitutability of different provider implementations. >>>> >>>> At some point, you just have to trust the bundle developers and if they >>>> end up lying, the you put that bundle developer on your blacklist and >>>> you >>>> exclude them in your future choices. >>>> >>>> As with everything, you're not going to get something (worthwhile) for >>>> free. >>>> >>>> -> richard >>>> >>>> >>>> >>>> Once again thanks for your answers. Please correct me if >>>>> I misunderstood something. >>>>> >>>>> Regards, >>>>> Milen >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> On Sun, May 17, 2015 at 8:01 PM, Richard S. Hall<he...@ungoverned.org> >>>>> wrote: >>>>> >>>>> On 5/17/15 12:57 , Milen Dyankov wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>>> I recently stumbled upon something that makes me wonder about OSGI >>>>>>> specs >>>>>>> APIs. As Metatype was the one API that made me start thinking about >>>>>>> the >>>>>>> issue, I'll use it as an example but the question is about APIs in >>>>>>> general. >>>>>>> >>>>>>> So while attempting to replace Felix's Metatype with Equinox one, I >>>>>>> realized Felix implementation jar provides also the API while Equinox >>>>>>> does >>>>>>> not. So my first thought was that there should be another jar with >>>>>>> the >>>>>>> API >>>>>>> alone but I couldn't find one. Second thought was to install >>>>>>> osgi.cmpn.jar >>>>>>> (it's a bundle after all) but I was told I should never do that and >>>>>>> that >>>>>>> those jars are provided to be only used as compile time dependencies. >>>>>>> >>>>>>> So here comes the question - who should provide the APIs at runtime >>>>>>> for >>>>>>> a >>>>>>> OSGI specs? >>>>>>> >>>>>>> See the FAQ: >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> http://felix.apache.org/documentation/tutorials-examples-and-presentations/apache-felix-osgi-faq.html#should-a-service-providerconsumer-bundle-be-packaged-with-its-service-api-packages >>>>>> >>>>>> I would actually split the question into a few: >>>>>> >>>>>> - is it really forbidden/nor recommended to use osgi.cmpn.jar at >>>>>>> runtime? >>>>>>> If so can someone please elaborate? >>>>>>> >>>>>>> This should probably be in the FAQ too. The compendium only happens >>>>>>> to >>>>>>> >>>>>> be >>>>>> packaged as a bundle because that is how it is built, not because it >>>>>> actually is a proper bundle. It is not cohesive, since it is just a >>>>>> collection of API, and pulls in unnecessary dependencies. The OSGi >>>>>> Alliance >>>>>> should probably quit publishing it as a bundle. Over the years, we >>>>>> seen >>>>>> lots of users run into difficulties when using it as a bundle. >>>>>> >>>>>> - shouldn't there be independent (perhaps released by OSGI >>>>>> alliance) >>>>>> API >>>>>> >>>>>> bundles? If there should be but they are missing at the moment then >>>>>>> why >>>>>>> Felix does not provide APIs in a separate bundles instead of >>>>>>> packaging >>>>>>> them >>>>>>> with the implementation? >>>>>>> >>>>>>> It's not really the purpose of the OSGi Alliance, but I suppose they >>>>>>> >>>>>> could. At Apache Felix, we have enough bundles to maintain, without >>>>>> creating more. >>>>>> >>>>>> - finally if the expectation is that each implementation provides >>>>>> also >>>>>> the >>>>>> >>>>>> API isn't this leading to split package condition? I'm aware for most >>>>>>> specs >>>>>>> it probably makes no sense to have 2 different implementations at the >>>>>>> same >>>>>>> time but still ... >>>>>>> >>>>>>> No. How would they be split? Packages are self contained in OSGi >>>>>>> >>>>>> bundles >>>>>> unless you explicitly make them split. If done properly, there is >>>>>> little >>>>>> harm in having multiple providers of a package. However, having a >>>>>> single >>>>>> provider does provide some benefits too. As the FAQ says, it just >>>>>> depends >>>>>> on your situation. >>>>>> >>>>>> If you really are dealing with composing a system out of third-party >>>>>> bundles, though, you cannot really always have it your way so you >>>>>> have to >>>>>> deal with the realities on the ground. >>>>>> >>>>>> -> richard >>>>>> >>>>>> >>>>>> I would appreciate if someone can throw more light on the subject. >>>>>> >>>>>>> Regards, >>>>>>> Milen >>>>>>> >>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>> >>>>>> To unsubscribe, e-mail:users-unsubscr...@felix.apache.org >>>>>> For additional commands, e-mail:users-h...@felix.apache.org >>>>>> >>>>>> >>>>>> >>>>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: users-unsubscr...@felix.apache.org >>>> For additional commands, e-mail: users-h...@felix.apache.org >>>> >>>> >>>> >>> -- >>> http://about.me/milen >>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: users-unsubscr...@felix.apache.org >> For additional commands, e-mail: users-h...@felix.apache.org >> >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@felix.apache.org > For additional commands, e-mail: users-h...@felix.apache.org > > -- *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)