Proposed enhancement to Layer API

David M. Lloyd david.lloyd at redhat.com
Tue Jan 3 20:45:04 UTC 2017


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


More information about the jigsaw-dev mailing list