src/java.base/share/classes/jdk/internal/module/ModulePatcher.java
author redestad
Tue, 07 Aug 2018 23:08:52 +0200
changeset 51327 a19fda433921
parent 47216 71c04702a3d5
child 52427 3c6aa484536c
permissions -rw-r--r--
8209003: Consolidate use of empty collections in java.lang.module Reviewed-by: alanb, mchung
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     1
/*
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
     2
 * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     4
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    10
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    15
 * accompanied this code).
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    16
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    20
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    23
 * questions.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    24
 */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    25
package jdk.internal.module;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    26
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    27
import java.io.Closeable;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    28
import java.io.File;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    29
import java.io.IOError;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    30
import java.io.IOException;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    31
import java.io.InputStream;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    32
import java.io.UncheckedIOException;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    33
import java.lang.module.ModuleDescriptor;
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
    34
import java.lang.module.ModuleDescriptor.Builder;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    35
import java.lang.module.ModuleReader;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    36
import java.lang.module.ModuleReference;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    37
import java.net.MalformedURLException;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    38
import java.net.URI;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    39
import java.net.URL;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    40
import java.nio.ByteBuffer;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    41
import java.nio.file.Files;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    42
import java.nio.file.Path;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    43
import java.nio.file.Paths;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    44
import java.util.ArrayList;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    45
import java.util.HashMap;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    46
import java.util.HashSet;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    47
import java.util.List;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    48
import java.util.Map;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    49
import java.util.Optional;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    50
import java.util.Set;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    51
import java.util.jar.JarEntry;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    52
import java.util.jar.JarFile;
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    53
import java.util.stream.Collectors;
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
    54
import java.util.stream.Stream;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    55
36674
7ab530dd6f10 8149122: Move sun.misc.URLClassPath and Resouce to an internal package
chegar
parents: 36511
diff changeset
    56
import jdk.internal.loader.Resource;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    57
import jdk.internal.misc.JavaLangModuleAccess;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    58
import jdk.internal.misc.SharedSecrets;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    59
import sun.net.www.ParseUtil;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    60
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    61
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    62
/**
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    63
 * Provides support for patching modules, mostly the boot layer.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    64
 */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    65
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    66
public final class ModulePatcher {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    67
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    68
    private static final JavaLangModuleAccess JLMA
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    69
        = SharedSecrets.getJavaLangModuleAccess();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    70
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    71
    // module name -> sequence of patches (directories or JAR files)
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    72
    private final Map<String, List<Path>> map;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    73
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    74
    /**
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    75
     * Initialize the module patcher with the given map. The map key is
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    76
     * the module name, the value is a list of path strings.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    77
     */
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    78
    public ModulePatcher(Map<String, List<String>> input) {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    79
        if (input.isEmpty()) {
51327
a19fda433921 8209003: Consolidate use of empty collections in java.lang.module
redestad
parents: 47216
diff changeset
    80
            this.map = Map.of();
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    81
        } else {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    82
            Map<String, List<Path>> map = new HashMap<>();
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    83
            for (Map.Entry<String, List<String>> e : input.entrySet()) {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    84
                String mn = e.getKey();
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    85
                List<Path> paths = e.getValue().stream()
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    86
                        .map(Paths::get)
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    87
                        .collect(Collectors.toList());
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    88
                map.put(mn, paths);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    89
            }
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    90
            this.map = map;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    91
        }
40261
86a49ba76f52 8136930: Simplify use of module-system options by custom launchers
mchung
parents: 37779
diff changeset
    92
    }
86a49ba76f52 8136930: Simplify use of module-system options by custom launchers
mchung
parents: 37779
diff changeset
    93
86a49ba76f52 8136930: Simplify use of module-system options by custom launchers
mchung
parents: 37779
diff changeset
    94
    /**
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    95
     * Returns a module reference that interposes on the given module if
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    96
     * needed. If there are no patches for the given module then the module
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    97
     * reference is simply returned. Otherwise the patches for the module
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    98
     * are scanned (to find any new packages) and a new module reference is
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    99
     * returned.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   100
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   101
     * @throws UncheckedIOException if an I/O error is detected
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   102
     */
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   103
    public ModuleReference patchIfNeeded(ModuleReference mref) {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   104
        // if there are no patches for the module then nothing to do
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   105
        ModuleDescriptor descriptor = mref.descriptor();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   106
        String mn = descriptor.name();
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   107
        List<Path> paths = map.get(mn);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   108
        if (paths == null)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   109
            return mref;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   110
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   111
        // Scan the JAR file or directory tree to get the set of packages.
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   112
        // For automatic modules then packages that do not contain class files
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   113
        // must be ignored.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   114
        Set<String> packages = new HashSet<>();
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   115
        boolean isAutomatic = descriptor.isAutomatic();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   116
        try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   117
            for (Path file : paths) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   118
                if (Files.isRegularFile(file)) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   119
37779
7c84df693837 8154956: Module system implementation refresh (4/2016)
alanb
parents: 36674
diff changeset
   120
                    // JAR file - do not open as a multi-release JAR as this
7c84df693837 8154956: Module system implementation refresh (4/2016)
alanb
parents: 36674
diff changeset
   121
                    // is not supported by the boot class loader
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   122
                    try (JarFile jf = new JarFile(file.toString())) {
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   123
                        jf.stream()
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   124
                          .filter(e -> !e.isDirectory()
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   125
                                  && (!isAutomatic || e.getName().endsWith(".class")))
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   126
                          .map(e -> toPackageName(file, e))
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   127
                          .filter(Checks::isPackageName)
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   128
                          .forEach(packages::add);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   129
                    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   130
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   131
                } else if (Files.isDirectory(file)) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   132
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   133
                    // exploded directory without following sym links
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   134
                    Path top = file;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   135
                    Files.find(top, Integer.MAX_VALUE,
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   136
                               ((path, attrs) -> attrs.isRegularFile()))
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   137
                            .filter(path -> (!isAutomatic
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   138
                                    || path.toString().endsWith(".class"))
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   139
                                    && !isHidden(path))
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   140
                            .map(path -> toPackageName(top, path))
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   141
                            .filter(Checks::isPackageName)
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   142
                            .forEach(packages::add);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   143
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   144
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   145
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   146
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   147
        } catch (IOException ioe) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   148
            throw new UncheckedIOException(ioe);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   149
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   150
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   151
        // if there are new packages then we need a new ModuleDescriptor
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   152
        packages.removeAll(descriptor.packages());
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   153
        if (!packages.isEmpty()) {
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   154
            Builder builder = JLMA.newModuleBuilder(descriptor.name(),
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   155
                                                    /*strict*/ false,
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   156
                                                    descriptor.modifiers());
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   157
            if (!descriptor.isAutomatic()) {
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   158
                descriptor.requires().forEach(builder::requires);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   159
                descriptor.exports().forEach(builder::exports);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   160
                descriptor.opens().forEach(builder::opens);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   161
                descriptor.uses().forEach(builder::uses);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   162
            }
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   163
            descriptor.provides().forEach(builder::provides);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   164
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   165
            descriptor.version().ifPresent(builder::version);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   166
            descriptor.mainClass().ifPresent(builder::mainClass);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   167
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   168
            // original + new packages
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   169
            builder.packages(descriptor.packages());
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   170
            builder.packages(packages);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   171
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   172
            descriptor = builder.build();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   173
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   174
37779
7c84df693837 8154956: Module system implementation refresh (4/2016)
alanb
parents: 36674
diff changeset
   175
        // return a module reference to the patched module
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   176
        URI location = mref.location().orElse(null);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   177
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   178
        ModuleTarget target = null;
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   179
        ModuleHashes recordedHashes = null;
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   180
        ModuleHashes.HashSupplier hasher = null;
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   181
        ModuleResolution mres = null;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   182
        if (mref instanceof ModuleReferenceImpl) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   183
            ModuleReferenceImpl impl = (ModuleReferenceImpl)mref;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   184
            target = impl.moduleTarget();
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   185
            recordedHashes = impl.recordedHashes();
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   186
            hasher = impl.hasher();
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   187
            mres = impl.moduleResolution();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   188
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   189
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   190
        return new ModuleReferenceImpl(descriptor,
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   191
                                       location,
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   192
                                       () -> new PatchedModuleReader(paths, mref),
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   193
                                       this,
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   194
                                       target,
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   195
                                       recordedHashes,
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   196
                                       hasher,
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   197
                                       mres);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   198
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   199
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   200
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   201
    /**
46096
62c77b334012 8185853: Generate readability graph at link time and other startup improvements
alanb
parents: 45004
diff changeset
   202
     * Returns true is this module patcher has patches.
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   203
     */
46096
62c77b334012 8185853: Generate readability graph at link time and other startup improvements
alanb
parents: 45004
diff changeset
   204
    public boolean hasPatches() {
62c77b334012 8185853: Generate readability graph at link time and other startup improvements
alanb
parents: 45004
diff changeset
   205
        return !map.isEmpty();
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   206
    }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   207
42774
74bcf37d15d8 8168836: Minor clean up on warning/error messages on --add-exports and --add-reads
mchung
parents: 42703
diff changeset
   208
    /*
74bcf37d15d8 8168836: Minor clean up on warning/error messages on --add-exports and --add-reads
mchung
parents: 42703
diff changeset
   209
     * Returns the names of the patched modules.
74bcf37d15d8 8168836: Minor clean up on warning/error messages on --add-exports and --add-reads
mchung
parents: 42703
diff changeset
   210
     */
74bcf37d15d8 8168836: Minor clean up on warning/error messages on --add-exports and --add-reads
mchung
parents: 42703
diff changeset
   211
    Set<String> patchedModules() {
74bcf37d15d8 8168836: Minor clean up on warning/error messages on --add-exports and --add-reads
mchung
parents: 42703
diff changeset
   212
        return map.keySet();
74bcf37d15d8 8168836: Minor clean up on warning/error messages on --add-exports and --add-reads
mchung
parents: 42703
diff changeset
   213
    }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   214
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   215
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   216
     * A ModuleReader that reads resources from a patched module.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   217
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   218
     * This class is public so as to expose the findResource method to the
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   219
     * built-in class loaders and avoid locating the resource twice during
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   220
     * class loading (once to locate the resource, the second to gets the
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   221
     * URL for the CodeSource).
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   222
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   223
    public static class PatchedModuleReader implements ModuleReader {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   224
        private final List<ResourceFinder> finders;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   225
        private final ModuleReference mref;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   226
        private final URL delegateCodeSourceURL;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   227
        private volatile ModuleReader delegate;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   228
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   229
        /**
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   230
         * Creates the ModuleReader to reads resources in a patched module.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   231
         */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   232
        PatchedModuleReader(List<Path> patches, ModuleReference mref) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   233
            List<ResourceFinder> finders = new ArrayList<>();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   234
            boolean initialized = false;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   235
            try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   236
                for (Path file : patches) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   237
                    if (Files.isRegularFile(file)) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   238
                        finders.add(new JarResourceFinder(file));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   239
                    } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   240
                        finders.add(new ExplodedResourceFinder(file));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   241
                    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   242
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   243
                initialized = true;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   244
            } catch (IOException ioe) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   245
                throw new UncheckedIOException(ioe);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   246
            } finally {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   247
                // close all ResourceFinder in the event of an error
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   248
                if (!initialized) closeAll(finders);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   249
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   250
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   251
            this.finders = finders;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   252
            this.mref = mref;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   253
            this.delegateCodeSourceURL = codeSourceURL(mref);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   254
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   255
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   256
        /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   257
         * Closes all resource finders.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   258
         */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   259
        private static void closeAll(List<ResourceFinder> finders) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   260
            for (ResourceFinder finder : finders) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   261
                try { finder.close(); } catch (IOException ioe) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   262
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   263
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   264
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   265
        /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   266
         * Returns the code source URL for the given module.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   267
         */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   268
        private static URL codeSourceURL(ModuleReference mref) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   269
            try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   270
                Optional<URI> ouri = mref.location();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   271
                if (ouri.isPresent())
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   272
                    return ouri.get().toURL();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   273
            } catch (MalformedURLException e) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   274
            return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   275
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   276
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   277
        /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   278
         * Returns the ModuleReader to delegate to when the resource is not
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   279
         * found in a patch location.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   280
         */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   281
        private ModuleReader delegate() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   282
            ModuleReader r = delegate;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   283
            if (r == null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   284
                synchronized (this) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   285
                    r = delegate;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   286
                    if (r == null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   287
                        delegate = r = mref.open();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   288
                    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   289
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   290
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   291
            return r;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   292
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   293
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   294
        /**
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   295
         * Finds a resources in the patch locations. Returns null if not found
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   296
         * or the name is "module-info.class" as that cannot be overridden.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   297
         */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   298
        private Resource findResourceInPatch(String name) throws IOException {
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   299
            if (!name.equals("module-info.class")) {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   300
                for (ResourceFinder finder : finders) {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   301
                    Resource r = finder.find(name);
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   302
                    if (r != null)
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   303
                        return r;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   304
                }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   305
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   306
            return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   307
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   308
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   309
        /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   310
         * Finds a resource of the given name in the patched module.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   311
         */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   312
        public Resource findResource(String name) throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   313
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   314
            // patch locations
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   315
            Resource r = findResourceInPatch(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   316
            if (r != null)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   317
                return r;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   318
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   319
            // original module
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   320
            ByteBuffer bb = delegate().read(name).orElse(null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   321
            if (bb == null)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   322
                return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   323
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   324
            return new Resource() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   325
                private <T> T shouldNotGetHere(Class<T> type) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   326
                    throw new InternalError("should not get here");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   327
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   328
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   329
                public String getName() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   330
                    return shouldNotGetHere(String.class);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   331
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   332
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   333
                public URL getURL() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   334
                    return shouldNotGetHere(URL.class);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   335
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   336
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   337
                public URL getCodeSourceURL() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   338
                    return delegateCodeSourceURL;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   339
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   340
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   341
                public ByteBuffer getByteBuffer() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   342
                    return bb;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   343
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   344
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   345
                public InputStream getInputStream() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   346
                    return shouldNotGetHere(InputStream.class);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   347
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   348
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   349
                public int getContentLength() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   350
                    return shouldNotGetHere(int.class);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   351
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   352
            };
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   353
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   354
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   355
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   356
        public Optional<URI> find(String name) throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   357
            Resource r = findResourceInPatch(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   358
            if (r != null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   359
                URI uri = URI.create(r.getURL().toString());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   360
                return Optional.of(uri);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   361
            } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   362
                return delegate().find(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   363
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   364
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   365
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   366
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   367
        public Optional<InputStream> open(String name) throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   368
            Resource r = findResourceInPatch(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   369
            if (r != null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   370
                return Optional.of(r.getInputStream());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   371
            } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   372
                return delegate().open(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   373
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   374
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   375
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   376
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   377
        public Optional<ByteBuffer> read(String name) throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   378
            Resource r = findResourceInPatch(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   379
            if (r != null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   380
                ByteBuffer bb = r.getByteBuffer();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   381
                assert !bb.isDirect();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   382
                return Optional.of(bb);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   383
            } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   384
                return delegate().read(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   385
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   386
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   387
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   388
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   389
        public void release(ByteBuffer bb) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   390
            if (bb.isDirect()) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   391
                try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   392
                    delegate().release(bb);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   393
                } catch (IOException ioe) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   394
                    throw new InternalError(ioe);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   395
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   396
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   397
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   398
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   399
        @Override
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   400
        public Stream<String> list() throws IOException {
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   401
            Stream<String> s = delegate().list();
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   402
            for (ResourceFinder finder : finders) {
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   403
                s = Stream.concat(s, finder.list());
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   404
            }
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   405
            return s.distinct();
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   406
        }
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   407
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   408
        @Override
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   409
        public void close() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   410
            closeAll(finders);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   411
            delegate().close();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   412
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   413
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   414
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   415
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   416
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   417
     * A resource finder that find resources in a patch location.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   418
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   419
    private static interface ResourceFinder extends Closeable {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   420
        Resource find(String name) throws IOException;
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   421
        Stream<String> list() throws IOException;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   422
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   423
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   424
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   425
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   426
     * A ResourceFinder that finds resources in a JAR file.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   427
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   428
    private static class JarResourceFinder implements ResourceFinder {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   429
        private final JarFile jf;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   430
        private final URL csURL;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   431
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   432
        JarResourceFinder(Path path) throws IOException {
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   433
            this.jf = new JarFile(path.toString());
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   434
            this.csURL = path.toUri().toURL();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   435
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   436
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   437
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   438
        public void close() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   439
            jf.close();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   440
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   441
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   442
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   443
        public Resource find(String name) throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   444
            JarEntry entry = jf.getJarEntry(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   445
            if (entry == null)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   446
                return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   447
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   448
            return new Resource() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   449
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   450
                public String getName() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   451
                    return name;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   452
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   453
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   454
                public URL getURL() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   455
                    String encodedPath = ParseUtil.encodePath(name, false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   456
                    try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   457
                        return new URL("jar:" + csURL + "!/" + encodedPath);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   458
                    } catch (MalformedURLException e) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   459
                        return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   460
                    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   461
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   462
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   463
                public URL getCodeSourceURL() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   464
                    return csURL;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   465
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   466
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   467
                public ByteBuffer getByteBuffer() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   468
                    byte[] bytes = getInputStream().readAllBytes();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   469
                    return ByteBuffer.wrap(bytes);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   470
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   471
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   472
                public InputStream getInputStream() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   473
                    return jf.getInputStream(entry);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   474
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   475
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   476
                public int getContentLength() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   477
                    long size = entry.getSize();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   478
                    return (size > Integer.MAX_VALUE) ? -1 : (int) size;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   479
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   480
            };
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   481
        }
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   482
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   483
        @Override
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   484
        public Stream<String> list() throws IOException {
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   485
            return jf.stream().map(JarEntry::getName);
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   486
        }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   487
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   488
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   489
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   490
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   491
     * A ResourceFinder that finds resources on the file system.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   492
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   493
    private static class ExplodedResourceFinder implements ResourceFinder {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   494
        private final Path dir;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   495
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   496
        ExplodedResourceFinder(Path dir) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   497
            this.dir = dir;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   498
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   499
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   500
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   501
        public void close() { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   502
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   503
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   504
        public Resource find(String name) throws IOException {
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   505
            Path file = Resources.toFilePath(dir, name);
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   506
            if (file != null) {
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   507
                return newResource(name, dir, file);
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   508
            } else {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   509
                return null;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   510
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   511
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   512
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   513
        private Resource newResource(String name, Path top, Path file) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   514
            return new Resource() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   515
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   516
                public String getName() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   517
                    return name;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   518
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   519
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   520
                public URL getURL() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   521
                    try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   522
                        return file.toUri().toURL();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   523
                    } catch (IOException | IOError e) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   524
                        return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   525
                    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   526
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   527
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   528
                public URL getCodeSourceURL() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   529
                    try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   530
                        return top.toUri().toURL();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   531
                    } catch (IOException | IOError e) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   532
                        return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   533
                    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   534
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   535
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   536
                public ByteBuffer getByteBuffer() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   537
                    return ByteBuffer.wrap(Files.readAllBytes(file));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   538
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   539
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   540
                public InputStream getInputStream() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   541
                    return Files.newInputStream(file);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   542
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   543
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   544
                public int getContentLength() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   545
                    long size = Files.size(file);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   546
                    return (size > Integer.MAX_VALUE) ? -1 : (int)size;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   547
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   548
            };
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   549
        }
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   550
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   551
        @Override
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   552
        public Stream<String> list() throws IOException {
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   553
            return Files.walk(dir, Integer.MAX_VALUE)
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   554
                        .map(f -> Resources.toResourceName(dir, f))
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   555
                        .filter(s -> s.length() > 0);
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   556
        }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   557
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   558
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   559
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   560
    /**
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   561
     * Derives a package name from the file path of an entry in an exploded patch
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   562
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   563
    private static String toPackageName(Path top, Path file) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   564
        Path entry = top.relativize(file);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   565
        Path parent = entry.getParent();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   566
        if (parent == null) {
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   567
            return warnIfModuleInfo(top, entry.toString());
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   568
        } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   569
            return parent.toString().replace(File.separatorChar, '.');
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   570
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   571
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   572
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   573
    /**
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   574
     * Returns true if the given file exists and is a hidden file
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   575
     */
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   576
    private boolean isHidden(Path file) {
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   577
        try {
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   578
            return Files.isHidden(file);
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   579
        } catch (IOException ioe) {
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   580
            return false;
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   581
        }
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   582
    }
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   583
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   584
    /**
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   585
     * Derives a package name from the name of an entry in a JAR file.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   586
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   587
    private static String toPackageName(Path file, JarEntry entry) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   588
        String name = entry.getName();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   589
        int index = name.lastIndexOf("/");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   590
        if (index == -1) {
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   591
            return warnIfModuleInfo(file, name);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   592
        } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   593
            return name.substring(0, index).replace('/', '.');
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   594
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   595
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   596
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   597
    private static String warnIfModuleInfo(Path file, String e) {
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   598
        if (e.equals("module-info.class"))
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   599
            System.err.println("WARNING: " + e + " ignored in patch: " + file);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   600
        return "";
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   601
    }
36674
7ab530dd6f10 8149122: Move sun.misc.URLClassPath and Resouce to an internal package
chegar
parents: 36511
diff changeset
   602
}