Hi,

I have a question about the following ...

On 07/13/2016 11:47 PM, mark.reinh...@oracle.com wrote:
To point (2), if some packages in a user module need to be exported for
reflection at run time, and a container wishes to ensure that only select
"trusted" framework modules can access the types in those packages, then
that's already expressible today.  We can also ensure that the set of
packages exported by a module is the same whether it's used standalone
on Java SE versus inside a container, which as you observe elsewhere in
this thread [1] could be problematic.

Suppose, e.g., we have an application module that's written against JPA,
rather than any specific JPA implementation, and exports the package
containing its entity classes for reflection at run time:

     module com.foo.data {
         requires java.persistence;
         exports dynamic com.foo.data.model;
     }

When used standalone, outside of a container, this module will export the
package containing its entity classes for reflection at run time.  The
classes will be accessible to every other module, but from a security and
integrity standpoint we assume that whoever invokes the run-time system,
i.e., whoever provides the command-line arguments to the `java` launcher
or its equivalent, is trusted to ensure that no adversarial modules are
present.

When used inside a container, the container already has the power to
prevent an adversarial module from accessing the module's entity classes.
That's because we expect containers to load every application into a
unique layer [2], and a container can rewrite module descriptors when
configuring a layer.  This is nothing to be ashamed of -- we fully expect
it to become a common practice.

If the container is set up to provide, e.g., Hibernate to this particular
application, then it could narrow the accessibility of the entity classes
by rewriting the above module declaration to refine the `exports dynamic`
directive:

     module com.foo.data {
         requires java.persistence;
         exports dynamic com.foo.data.model
              to hibernate.core, hibernate.entitymanager;
     }

(This is one of the very few use cases for qualified dynamic exports.)

Whether standalone or in a container the same set of packages is exported
by the module; the only difference is that, inside the container, the
exports are qualified.

What additional metadata does container need to rewrite a module descriptor like in above example? Does it need the whole set of exports that replace existing dynamic exports? Or only the target modules that it "attaches" to all unqualified dynamic exports? If the later, then what does container do if one wants to rewrite only a selection of unqualified dynamic exports to target one set of modules (for example an IoC implementation) and another (possibly overlapping) selection of exports to target some other set of modules (for example a JPA implementation)? Does it give up and "attaches" all targets to all unqualified dynamic exports ?

I think something is missing here. A kind of hook to identify or "tag" a set of unqualified dynamic exports so that it can be located by the container.

Regards, Peter

Reply via email to