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