Relationship to JSR 291 [was: Re: Bryan's comments]
Bryan Atsatt
bryan.atsatt at oracle.com
Tue Jun 5 14:58:39 PDT 2007
Glyn Normington wrote:
>
> *Bryan Atsatt <bryan.atsatt at ORACLE.COM>* wrote on 04/06/2007 20:21:29:
>
> > Stanley M. Ho wrote:
> > > Hi Bryan,
> > >
> > > I don't think I will have time to response to all your comments this
> > > week, so my response would focus on the import-by-package discussion.
> > >
> > > First, the only import dependency we have consensus in this EG so
> far is
> > > import-by-module-name (or import-by-superpackage-name), and this was
> > > also what's in the EDR. That said, it is by no mean that we can't
> > > consider other import dependency granularities (e.g.
> > > import-by-package-name, or import-by-contract) in addition to
> > > import-by-module-name. I would like to focus this discussion more on
> > > whether it makes sense for JSR 277 to support additional import
> > > dependency granularity, mainly import-by-package-name, and if so, in
> > > what context.
> > >
> > > There are three cases we should consider:
> > >
> > > 1. 277 module imports another 277 module by package name
> > >
> > > I think our consensus so far is that this is nice-to-have or
> > > non-critical, given we already have support for import-by-module-name.
> > > To keep this discussion in focus, let's not dive into
> > > import-by-package-name v.s. import-by-module-name, and let's assume
> > > there is no support for #1 for now.
> >
> > Agreed.
> >
> > >
> > > 2. OSGi module imports 277 module by package name
> > >
> > > As I discussed this with Richard in previous emails, majority of the
> > > works for this fall under the OSGi framework if it wants to enable this
> > > kind of wiring, but we could probably make the implementor's life
> easier
> > > by provide the appropriate 277 reflective API if necessary.
> >
> > Yes, the API would be useful.
> >
> > >
> > > 3. 277 module imports OSGi module by package name
> > >
> > > If I understand you correctly, I think what you really want is the
> > > support for this case, so the existing OSGi bundles can be leveraged by
> > > 277 modules in a nature way.
> > >
> > > Let me say it up front that I don't oppose the idea of #3 in the
> context
> > > of interoperability. If #3 is what you really want, I think where we
> > > diverge is simply how to make it possible.
> > >
> > > Do you agree so far?
> >
> > Yes.
> >
> > >
> > > Bryan Atsatt wrote:
> > >> ...
> > >> I want 277 to explicitly expose the concept of import-by-package
> through
> > >> appropriate APIs.
> > >>
> > >> It would be very nice if the 277ModuleSystem implementation itself
> > >> directly supports import-by-package (case #3). But this is less
> critical
> > >> to me than case #4...
> > >>
> > >> I want a 277ModuleDefinition to be able to import-by-package an
> > >> OSGiModuleDefinition (i.e. a bundle exposed via the 277 APIs). I
> believe
> > >> this case will be a particularly important one. By the time SE 7
> ships,
> > > ...
> > >
> > > As I described several emails back:
> > >
> > > > This doesn't mean supporting the notion of import by package is
> > > > impossible. What OSGi will expose from its repository is simply
> module
> > > > definitions, and module definition is basically an abstraction.
> > > > Therefore, it should be possible to treat an OSGi bundle as a module
> > > > definition, as well as to treat each exported package in an OSGi
> > > > bundle a module definition as well. The dependency supported in JSR
> > > > 277 is import-by-module. In the JSR 277 module system, this is
> mapped
> > > > to import-by-superpackage. In the OSGi module system, this can be
> > > > mapped to import-by-OSGi-bundle or import-by-package. If other
> module
> > > > systems want to support different import granularity or if OSGi
> > > > evolves to add new import granularity in the future, this model
> should
> > > > still work.
> > >
> > > Rather than surfacing the import-by-package at the API level, I
> think we
> > > can solve #3 by generalizing the import dependency concept as
> > > import-by-name, and this name can be mapped to superpackage-name in JSR
> > > 277 and OSGi-bundle-name or OSGi-exported-package-name in OSGi (i.e.
> > > exposing OSGi bundles and exported packages through implementing
> > > OSGiBundleModuleDefinition and OSGiPackageModuleDefinition). I think
> > > this is also what you intended to say at one point (correct me if I
> > > misunderstand you) by suggesting to change
> > > ImportDependency.getModuleName() into something like
> > > ImportDependency.getName().
> >
> > I believe we are now thinking along the same lines.
> >
> > I just sent an email on the topic of generalizing the import dependency
> > concept, with the subject "Import constraints". With the approach I
> > suggest there, the distinctions between module-name and package-name are
> > mostly transparent to the runtime (declarative support for package-name
> > is not addressed).
> >
> > That isn't to say that there aren't resolution issues to be worked out
> > for package-name, but its a start.
> >
> > >
> > > We expect the module-aware compiler would somehow recognize the import
> > > dependency defined in 277. In other words, if the OSGi framework
> exposes
> > > the module definitions appropriately, you'll get the compiler support.
> > > Since the import dependency is generic, the compiler and other tools ed
> > > to do extra work to support other forms of import dependency.
> >
> > Yep. As I've said from the very beginning, I think the compiler is going
> > to have to rely on the 277 runtime to resolve *external* (i.e.
> > non-source) dependencies. So as long as the runtime can deal with
> > package-name, the compiler will too.
> >
> > (Dependencies resolvable via included source will, I assume, just
> > *directly* resolve, without applying any constraint logic. That is, if a
> > class refers to a class in another superpackage, and that class &
> > superpackage are available in the same compilation, the compiler will
> > simply select them without applying *any* constraints. This may be too
> > simple of a model, but maybe it is sufficient.)
> >
> > >
> > > In case if the 277 module would like to import these OSGi exported
> > > packages using an OSGi-like resolution algorithm, it should be possible
> > > for it to use a custom import policy (or import override policy or
> maybe
> > > some new override mechanisms) to get the behavior it wants.
> > >
> > > Do you think this is a workable approach to address #3?
> >
> > I don't think custom code should be required; we need to make it easier
> > than that or it doesn't qualify as "first-class" citizenship, at least
> > not to me :^).
> >
> >
> > I guess I am still missing something fundamental--I keep thinking that
> > import-by-package is actually not so hard. There are three main
> components:
> >
> > 1. Declaration.
> > 2. Runtime infrastructure.
> > 3. Resolution algorithm.
> >
> > I'm pretty sure that #2 is easy (and covered in my "Import constraints"
> > thread).
> >
> > And we don't yet have *any* import declaration mechanism (yes, we're
> > assuming that this will be handled in 294, but it hasn't been brought up
> > yet). I don't see this as a difficult issue either way. It would be
> > natural to have both import-by-name and import-by-package in
> > superpackages, if we have import at all. If we need to use annotations
> > instead, it is easy to have both types.
> >
> > So I can only assume that the *real* concern here is #3. And I can't
> > tell if this is a valid concern or not. I hope Glyn and Richard will
> > point out what I'm missing here...
>
> Sounds right to me. However, the JSR 291 support for import-package is
> more subtle, and I would say was generally harder to get right (over
> several versions and several years), than require-bundle which was added
> fairly simply (despite the semantic rough edges, pointed out in the
> spec.). Although JSR 277 has paid lip service to learning from OSGi, the
> design is radically different in several ways:
>
> * dependencies expressed in metadata and code rather than purely in
> metadata
> * split packages not allowed
> * shallow/deep validation to avoid class space inconsistency rather than
> metadata expressing package dependencies and a system provided resolver
> that aims to find a "best fit"
>
> so my feeling is that we've got a quite a lot of work to do to support
> something equivalent to import-by-package. Of course, it may turn out to
> be simpler than I expect...
And that's what I'm struggling to determine. I do understand that 277
has taken a different approach, and so there is some cognitive
dissonance here.
But, the list you cite above seems a bit hand-wavy to me (sorry :^),
perhaps just distinctions without a difference.
My question below still stands. In general, it seems to me that
resolution consists of:
1. Selection of candidate module/bundles based on import declarations.
2. Class space consistency validation (which may narrow the list if
multiple choices, or result in a failure).
I don't understand what possible difference it could make whether we use
a module name or a package name to select candidates in step 1. Or even
if some custom code makes that selection (though I'm not a fan of this
either.)
Can anyone explain what difference it might make?
The selection criteria are entirely up to the developer/deployer; our
job is to make the best choices *within* that scope at runtime, or fail
if required if they violate the rules.
// Bryan
> > What is the difference between selecting a ModuleDefinition based on its
> > name, or selecting it based on its contents? Either way, "shallow"
> > validation must still occur.
> >
> > // Bryan
> >
> > >
> > > - Stanley
> > >
>
> Glyn
>
>
> ------------------------------------------------------------------------
>
> /
> /
>
> /Unless stated otherwise above:
> IBM United Kingdom Limited - Registered in England and Wales with number
> 741598.
> Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU/
>
>
>
>
>
>
More information about the jsr277-eg-observer
mailing list