I agree with all the proposed methods but the one that add a package, in my opinion, a package is part of what structurally define a module, it should not be possible to add it after the resolution algorithm.
Rémi ----- Mail original ----- > De: "David M. Lloyd" <david.ll...@redhat.com> > À: "jigsaw-dev" <jigsaw-dev@openjdk.java.net> > Envoyé: Mardi 3 Janvier 2017 21:45:04 > Objet: Proposed enhancement to Layer API > This is a proposed enhancement to the Layer API, a sibling to the > discussion around #NonHierarchicalLayers going on in the JPMS spec list. > While discussion is ongoing, I want to ensure that there is a "real" > patch somewhere out in the public that can be referenced and discussed. > > Essentially this patch allows our module system to achieve a basic level > of functionality in conjunction with Jigsaw, by giving the Layer's > Controller more control over the content and behavior of its modules. > > I hereby (on behalf of myself and of my employer) submit the code in the > patch in this email message under the terms of the MIT license, which > (among other things) should allow the OpenJDK project to appropriate and > modify these code changes at will without copyright assignment issues. > > Here's the patch: > > diff --git > a/jdk/src/java.base/share/classes/java/lang/reflect/Layer.java > b/jdk/src/java.base/share/classes/java/lang/reflect/Layer.java > index 4b4588c..be013e9 100644 > --- a/jdk/src/java.base/share/classes/java/lang/reflect/Layer.java > +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Layer.java > @@ -196,6 +196,28 @@ public final class Layer { > > > /** > + * Updates module {@code source} in the layer to contain a new > package. > + * This method is a no-op if {@code source} already contains > package {@code pn}. > + * > + * @param source > + * The source module > + * @param pn > + * The package name to add > + * > + * @return This controller > + * > + * @throws IllegalArgumentException > + * If {@code source} is not in the layer > + */ > + public Controller addPackage(Module source, String pn) { > + Objects.requireNonNull(source); > + Objects.requireNonNull(pn); > + ensureInLayer(source); > + Modules.addPackage(source, pn); > + return this; > + } > + > + /** > * Updates module {@code source} in the layer to read module > * {@code target}. This method is a no-op if {@code source} > already > * reads {@code target}. > @@ -251,6 +273,160 @@ public final class Layer { > Modules.addOpens(source, pn, target); > return this; > } > + > + /** > + * Updates module {@code source} in the layer to open a package to > + * all modules. > + * > + * @param source > + * The source module > + * @param pn > + * The package name > + * > + * @return This controller > + * > + * @throws IllegalArgumentException > + * If {@code source} is not in the layer or the package > is not > + * in the source module > + * > + * @see Module#addOpens > + */ > + public Controller addOpensToAll(Module source, String pn) { > + Objects.requireNonNull(source); > + ensureInLayer(source); > + Modules.addOpensToAll(source, pn); > + return this; > + } > + > + /** > + * Updates module {@code source} in the layer to open a package to > + * to all unnamed modules. > + * > + * @param source > + * The source module > + * @param pn > + * The package name > + * > + * @return This controller > + * > + * @throws IllegalArgumentException > + * If {@code source} is not in the layer or the package > is not > + * in the source module > + * > + * @see ModuleDescriptor.Builder#opens(String) > + */ > + public Controller addOpensToAllUnnamed(Module source, String pn) { > + Objects.requireNonNull(source); > + ensureInLayer(source); > + Modules.addOpensToAllUnnamed(source, pn); > + return this; > + } > + > + /** > + * Updates module {@code source} in the layer to export a > package to > + * module {@code target}. This method is a no-op if {@code source} > + * already exports the package to at least {@code target}. > + * > + * @param source > + * The source module > + * @param pn > + * The package name > + * @param target > + * The target module to read > + * > + * @return This controller > + * > + * @throws IllegalArgumentException > + * If {@code source} is not in the layer or the package > is not > + * in the source module > + * > + * @see Module#addExports > + */ > + public Controller addExports(Module source, String pn, Module > target) { > + Objects.requireNonNull(source); > + Objects.requireNonNull(target); > + ensureInLayer(source); > + Modules.addExports(source, pn, target); > + return this; > + } > + > + /** > + * Updates module {@code source} in the layer to export a > package to > + * module {@code target}. This method is a no-op if {@code source} > + * already exports the package to at least {@code target}. > + * > + * @param source > + * The source module > + * @param pn > + * The package name > + * > + * @return This controller > + * > + * @throws IllegalArgumentException > + * If {@code source} is not in the layer or the package > is not > + * in the source module > + * > + * @see Module#addExports > + */ > + public Controller addExportsToAll(Module source, String pn) { > + Objects.requireNonNull(source); > + ensureInLayer(source); > + Modules.addExportsToAll(source, pn); > + return this; > + } > + > + /** > + * Updates module {@code source} in the layer to export a > package to > + * all unnamed modules. > + * > + * @param source > + * The source module > + * @param pn > + * The package name > + * > + * @return This controller > + * > + * @throws IllegalArgumentException > + * If {@code source} is not in the layer or the package > is not > + * in the source module > + * > + * @see Module#addExports > + */ > + public Controller addExportsToAllUnnamed(Module source, String > pn) { > + Objects.requireNonNull(source); > + ensureInLayer(source); > + Modules.addExportsToAllUnnamed(source, pn); > + return this; > + } > + > + /** > + * Updates module {@code source} in the layer to add a > + * service dependence on the given service type. This method is > + * a no-op when invoked on an unnamed module or an automatic > module. > + * > + * <p> This method does not cause {@link > + * Configuration#resolveRequiresAndUses resolveRequiresAndUses} > to be > + * re-run. </p> > + * > + * @param service > + * The service type > + * > + * @return this module > + * > + * @throws IllegalStateException > + * If this is a named module and the caller is not this > module > + * > + * @see Module#addUses(Class) > + * @see ModuleDescriptor#uses() > + */ > + public Controller addUses(Module source, Class<?> service) { > + Objects.requireNonNull(source); > + Objects.requireNonNull(service); > + ensureInLayer(source); > + Modules.addUses(source, service); > + return this; > + } > + > } > > > -- > - DML