Proposed enhancement to Layer API
David M. Lloyd
david.lloyd at redhat.com
Wed Jan 4 14:21:22 UTC 2017
We need the ability to add content to a module after it is defined to
support our existing deployment architecture. Is there a material
problem with having this feature, other than transgressing your sense of
"should"?
On 01/03/2017 05:33 PM, Remi Forax wrote:
> 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.lloyd at redhat.com>
>> À: "jigsaw-dev" <jigsaw-dev at 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
--
- DML
More information about the jigsaw-dev
mailing list