runtime changes for services

Mandy Chung mandy.chung at oracle.com
Wed Feb 15 15:04:04 PST 2012


Alan,

The new module-info.java files with services look good. This
changeset looks good as the first installation.

I view "requires service S" as expanded to a set of requires
clauses on the module view that provides S at install time.
For example,
   module M {
      requires service S;
   }

If there are 3 different modules PS1, PS2, PS3 providing the
implementation of service S, it'd be like:
   module M {
      requires PS1;
      requires PS2;
      requires PS3;
   }

assuming there is no conflict among these dependencies.
Synthesizing view dependencies makes sense to me.

The synthesized dependency with no version query (Resolver.java
L327) leads me to rethink and wonder if the resolver has to take
services as a constraint.

   module M {
      requires MS;
      requires service S;
   }

   module MS @ 2.0 {
      // no provides service S
   }
   module MS @ 1.0 {
      provides service S with Impl;
   }

The synthesized dependency is "requires MS" with no version
query.  What would happen in this case?  I suspect the resolver
will fail as it chooses MS at 2.0 but it doesn't provide service S.
As sthe ensureServicesPresent() method will catch if there is
any service dependency not satisfied, this might be adequate.
This seems to be a discussion point for later.

On 2/9/2012 9:06 AM, Alan Bateman wrote:
>   http://cr.openjdk.java.net/~alanb/jigsaw-services/webrev/index.html
com/sun/classanalyzer/ModuleInfo.java
   L46: you're right that it needs to make a defensive copy
   of services and providers. L45 makes a copy of the requires
   and put it in a TreeSet so that ModuleInfo.getRequires()
   returns an ordered set for writing to module-info.java.

   L155-172: would it be better to sort the list before printing
   the "requires services" statements?  I believe the ordering of
   "provides service" statements matters and so it should keep
   it the same order as specified in the META-INF/services files.

java/util/ServiceLoader.java
   L357-359: for maintainability, would it be better to replace
   these lines with
      if (!hasNext()) {
          throw new NoSuchElementException();
      }

org/openjdk/jigsaw/Context.java
   L173, 203: I assume you want to fix these methods to return a
   unmodifiable map, right?  I don't see the code that expects
   them to be modifiable (maybe I miss something)?
  
org/openjdk/jigsaw/Linker.java
   L296: extra blank line

org/openjdk/jigsaw/Loader.java
   L286-289: can these lines be replaced with:
   Set<String>  remotes = context.serviceSuppliers().get(cn);
  
   L278: I wonder if this should return a map of ModuleClassLoader
   rather than ClassLoader just be explicit.

   L291: this causes the module loader for the service
   implementation class be instantiated. I presume we want
   the loader be instantiated lazily when it's loaded. On
   the other hand, the instantiation cost doesn't look like
   too high.  It's fine for the initial implementation but
   we should look into this open issue.

org/openjdk/jigsaw/Resolver.java
   L320,322,323, 338: a space below ":"
   There are other places missing the space in the foreach
   statements needed fixing too.

sun/tools/jar/Main.java
   L785: would you suggest to replace Charset.forName("UTF-8")
   with StandardCharsets.UTF_8 (no real difference though)?
   L989: This is not really a question for this change but
   you may have the answer. I have seen some copy of readAllBytes
   in other places. Have we considered adding this support
   to the platform?

new services tests
   Looks good.  The copyright start year should be 2012 :)
   I notice that some tests turn on assertion but some don't.
   It might be good to set -esa -ea on all tests I think.

Mandy




More information about the jigsaw-dev mailing list