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.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

--
- DML

Reply via email to