[jsr294-modularity-eg] Ignoring unknown directives...
Bryan Atsatt
bryan.atsatt at oracle.com
Wed Jun 17 21:19:51 EDT 2009
In today's call, it was suggested that an unknown directive (a.k.a.
'keyword' in my 5/14 message, partially copied below) could simply be
ignored by a system that does not understand it. The more I think about
this, the more I believe it is flat out wrong, violating the principle
of least surprise and introducing indeterminate behavior.
If I design a module relying on a specific set of semantics (e.g.
friendship), and your module system decides it can load my classes but
silently ignore some of my directives (e.g. 'permits'), I'm going to be
one very annoyed customer when the bugs (or worse) start coming in to
me. Sure, there may be trivial cases where I won't care, but... that
should be my choice. At minimum I need a way to declare that some
behavior is required, but it seems vastly more intuitive to make that
the default and provide syntax to explicitly mark optional behavior.
A model that allows me to state the semantics I expect at a high level
(e.g. "system jigsaw at 2.1;" or "system jigsaw guice;" or "system
EE at 7.0;") must result in failures if these constraints are not met by an
available implementation, which in turn constrains the supported
directives. If such constraints are implied by system configuration
rather than being explicitly declared, they must be stored in the
module-info.class file (as if they were declared) in order to preserve
them across systems with different configurations.
If the model allows me to qualify some semantics as optional at the
module level (e.g. "system jigsaw [guice];"), and/or at the directive
level (e.g. "[requires bar];"), then I can build a flexible but
deterministic system.
// Bryan
Bryan Atsatt wrote:
> treat all declarations uniformly as a 'keyword' followed by a list of
> ' ' separated strings, so:
>
> requires module m:1.1 local;
> requires module n:1.0 vendor=Sun optional;
> permits foo:1.0;
> permits bar vendor=Sun;
> classpath a.jar b.jar c.jar;
>
> can all be accessed via the same raw/low-level collection semantics:
>
> Set<List<String>> get(String keyWord);
>
> Calling info.get("requires") would return:
>
> {"module", "m:1.1", "local"}
> {"module", "n:1.0", "vendor=Sun", "optional"}
>
> and info.get("permits") would return:
>
> {"foo:1.0"}
> {"bar ", "vendor=Sun"}
>
> and info.get("classpath") would return:
>
> {"a.jar", "b.jar", "c.jar"}
_______________________________________________
jsr294-modularity-eg mailing list
jsr294-modularity-eg at cs.oswego.edu
http://cs.oswego.edu/mailman/listinfo/jsr294-modularity-eg
More information about the jsr294-modularity-observer
mailing list