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