jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java
author alanb
Thu, 04 May 2017 07:26:55 +0000
changeset 45004 ea3137042a61
parent 44545 83b611b88ac8
child 46096 62c77b334012
permissions -rw-r--r--
8178380: Module system implementation refresh (5/2017) Reviewed-by: mchung, alanb, sspitsyn Contributed-by: alan.bateman@oracle.com, mandy.chung@oracle.com, chris.hegarty@oracle.com
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.Collections;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    46
import java.util.HashMap;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    47
import java.util.HashSet;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    48
import java.util.List;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    49
import java.util.Map;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    50
import java.util.Optional;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    51
import java.util.Set;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    52
import java.util.jar.JarEntry;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    53
import java.util.jar.JarFile;
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    54
import java.util.stream.Collectors;
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
    55
import java.util.stream.Stream;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    56
36674
7ab530dd6f10 8149122: Move sun.misc.URLClassPath and Resouce to an internal package
chegar
parents: 36511
diff changeset
    57
import jdk.internal.loader.Resource;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    58
import jdk.internal.misc.JavaLangModuleAccess;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    59
import jdk.internal.misc.SharedSecrets;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    60
import sun.net.www.ParseUtil;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    61
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    62
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    63
/**
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    64
 * Provides support for patching modules, mostly the boot layer.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    65
 */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    66
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    67
public final class ModulePatcher {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    68
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    69
    private static final JavaLangModuleAccess JLMA
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    70
        = SharedSecrets.getJavaLangModuleAccess();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    71
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    72
    // module name -> sequence of patches (directories or JAR files)
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    73
    private final Map<String, List<Path>> map;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    74
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    75
    /**
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    76
     * 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
    77
     * the module name, the value is a list of path strings.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    78
     */
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    79
    public ModulePatcher(Map<String, List<String>> input) {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    80
        if (input.isEmpty()) {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    81
            this.map = Collections.emptyMap();
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    82
        } else {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    83
            Map<String, List<Path>> map = new HashMap<>();
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    84
            for (Map.Entry<String, List<String>> e : input.entrySet()) {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    85
                String mn = e.getKey();
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    86
                List<Path> paths = e.getValue().stream()
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    87
                        .map(Paths::get)
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    88
                        .collect(Collectors.toList());
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    89
                map.put(mn, paths);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    90
            }
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    91
            this.map = map;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    92
        }
40261
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
86a49ba76f52 8136930: Simplify use of module-system options by custom launchers
mchung
parents: 37779
diff changeset
    95
    /**
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    96
     * Returns a module reference that interposes on the given module if
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    97
     * needed. If there are no patches for the given module then the module
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    98
     * reference is simply returned. Otherwise the patches for the module
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
    99
     * 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
   100
     * returned.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   101
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   102
     * @throws UncheckedIOException if an I/O error is detected
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   103
     */
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   104
    public ModuleReference patchIfNeeded(ModuleReference mref) {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   105
        // if there are no patches for the module then nothing to do
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   106
        ModuleDescriptor descriptor = mref.descriptor();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   107
        String mn = descriptor.name();
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   108
        List<Path> paths = map.get(mn);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   109
        if (paths == null)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   110
            return mref;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   111
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   112
        // 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
   113
        // For automatic modules then packages that do not contain class files
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   114
        // must be ignored.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   115
        Set<String> packages = new HashSet<>();
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   116
        boolean isAutomatic = descriptor.isAutomatic();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   117
        try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   118
            for (Path file : paths) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   119
                if (Files.isRegularFile(file)) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   120
37779
7c84df693837 8154956: Module system implementation refresh (4/2016)
alanb
parents: 36674
diff changeset
   121
                    // 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
   122
                    // is not supported by the boot class loader
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   123
                    try (JarFile jf = new JarFile(file.toString())) {
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   124
                        jf.stream()
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   125
                          .filter(e -> !e.isDirectory()
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   126
                                  && (!isAutomatic || e.getName().endsWith(".class")))
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   127
                          .map(e -> toPackageName(file, e))
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   128
                          .filter(Checks::isPackageName)
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   129
                          .forEach(packages::add);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   130
                    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   131
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   132
                } else if (Files.isDirectory(file)) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   133
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   134
                    // exploded directory without following sym links
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   135
                    Path top = file;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   136
                    Files.find(top, Integer.MAX_VALUE,
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   137
                               ((path, attrs) -> attrs.isRegularFile()))
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   138
                            .filter(path -> (!isAutomatic
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   139
                                    || path.toString().endsWith(".class"))
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   140
                                    && !isHidden(path))
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   141
                            .map(path -> toPackageName(top, path))
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   142
                            .filter(Checks::isPackageName)
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   143
                            .forEach(packages::add);
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
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   148
        } catch (IOException ioe) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   149
            throw new UncheckedIOException(ioe);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   150
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   151
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   152
        // 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
   153
        packages.removeAll(descriptor.packages());
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   154
        if (!packages.isEmpty()) {
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   155
            Builder builder = JLMA.newModuleBuilder(descriptor.name(),
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   156
                                                    /*strict*/ false,
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   157
                                                    descriptor.modifiers());
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   158
            if (!descriptor.isAutomatic()) {
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   159
                descriptor.requires().forEach(builder::requires);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   160
                descriptor.exports().forEach(builder::exports);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   161
                descriptor.opens().forEach(builder::opens);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   162
                descriptor.uses().forEach(builder::uses);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   163
            }
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   164
            descriptor.provides().forEach(builder::provides);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   165
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   166
            descriptor.version().ifPresent(builder::version);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   167
            descriptor.mainClass().ifPresent(builder::mainClass);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   168
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   169
            // original + new packages
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   170
            builder.packages(descriptor.packages());
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   171
            builder.packages(packages);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   172
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42774
diff changeset
   173
            descriptor = builder.build();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   174
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   175
37779
7c84df693837 8154956: Module system implementation refresh (4/2016)
alanb
parents: 36674
diff changeset
   176
        // return a module reference to the patched module
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   177
        URI location = mref.location().orElse(null);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   178
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   179
        ModuleTarget target = null;
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   180
        ModuleHashes recordedHashes = null;
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   181
        ModuleHashes.HashSupplier hasher = null;
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   182
        ModuleResolution mres = null;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   183
        if (mref instanceof ModuleReferenceImpl) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   184
            ModuleReferenceImpl impl = (ModuleReferenceImpl)mref;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   185
            target = impl.moduleTarget();
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   186
            recordedHashes = impl.recordedHashes();
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   187
            hasher = impl.hasher();
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   188
            mres = impl.moduleResolution();
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
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   191
        return new ModuleReferenceImpl(descriptor,
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   192
                                       location,
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   193
                                       () -> new PatchedModuleReader(paths, mref),
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   194
                                       this,
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   195
                                       target,
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   196
                                       recordedHashes,
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   197
                                       hasher,
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 42338
diff changeset
   198
                                       mres);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   199
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   200
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   201
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   202
    /**
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   203
     * Returns true is this module patcher has no patches.
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   204
     */
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   205
    public boolean isEmpty() {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   206
        return map.isEmpty();
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   207
    }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41817
diff changeset
   208
42774
74bcf37d15d8 8168836: Minor clean up on warning/error messages on --add-exports and --add-reads
mchung
parents: 42703
diff changeset
   209
    /*
74bcf37d15d8 8168836: Minor clean up on warning/error messages on --add-exports and --add-reads
mchung
parents: 42703
diff changeset
   210
     * 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
   211
     */
74bcf37d15d8 8168836: Minor clean up on warning/error messages on --add-exports and --add-reads
mchung
parents: 42703
diff changeset
   212
    Set<String> patchedModules() {
74bcf37d15d8 8168836: Minor clean up on warning/error messages on --add-exports and --add-reads
mchung
parents: 42703
diff changeset
   213
        return map.keySet();
74bcf37d15d8 8168836: Minor clean up on warning/error messages on --add-exports and --add-reads
mchung
parents: 42703
diff changeset
   214
    }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   215
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   216
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   217
     * A ModuleReader that reads resources from a patched module.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   218
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   219
     * This class is public so as to expose the findResource method to the
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   220
     * built-in class loaders and avoid locating the resource twice during
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   221
     * class loading (once to locate the resource, the second to gets the
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   222
     * URL for the CodeSource).
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   223
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   224
    public static class PatchedModuleReader implements ModuleReader {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   225
        private final List<ResourceFinder> finders;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   226
        private final ModuleReference mref;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   227
        private final URL delegateCodeSourceURL;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   228
        private volatile ModuleReader delegate;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   229
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   230
        /**
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   231
         * Creates the ModuleReader to reads resources in a patched module.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   232
         */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   233
        PatchedModuleReader(List<Path> patches, ModuleReference mref) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   234
            List<ResourceFinder> finders = new ArrayList<>();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   235
            boolean initialized = false;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   236
            try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   237
                for (Path file : patches) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   238
                    if (Files.isRegularFile(file)) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   239
                        finders.add(new JarResourceFinder(file));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   240
                    } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   241
                        finders.add(new ExplodedResourceFinder(file));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   242
                    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   243
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   244
                initialized = true;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   245
            } catch (IOException ioe) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   246
                throw new UncheckedIOException(ioe);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   247
            } finally {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   248
                // close all ResourceFinder in the event of an error
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   249
                if (!initialized) closeAll(finders);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   250
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   251
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   252
            this.finders = finders;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   253
            this.mref = mref;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   254
            this.delegateCodeSourceURL = codeSourceURL(mref);
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
        /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   258
         * Closes all resource finders.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   259
         */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   260
        private static void closeAll(List<ResourceFinder> finders) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   261
            for (ResourceFinder finder : finders) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   262
                try { finder.close(); } catch (IOException ioe) { }
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
        /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   267
         * Returns the code source URL for the given module.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   268
         */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   269
        private static URL codeSourceURL(ModuleReference mref) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   270
            try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   271
                Optional<URI> ouri = mref.location();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   272
                if (ouri.isPresent())
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   273
                    return ouri.get().toURL();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   274
            } catch (MalformedURLException e) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   275
            return null;
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
        /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   279
         * Returns the ModuleReader to delegate to when the resource is not
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   280
         * found in a patch location.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   281
         */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   282
        private ModuleReader delegate() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   283
            ModuleReader r = delegate;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   284
            if (r == null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   285
                synchronized (this) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   286
                    r = delegate;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   287
                    if (r == null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   288
                        delegate = r = mref.open();
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
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   292
            return r;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   293
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   294
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   295
        /**
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   296
         * 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
   297
         * or the name is "module-info.class" as that cannot be overridden.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   298
         */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   299
        private Resource findResourceInPatch(String name) throws IOException {
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   300
            if (!name.equals("module-info.class")) {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   301
                for (ResourceFinder finder : finders) {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   302
                    Resource r = finder.find(name);
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   303
                    if (r != null)
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   304
                        return r;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   305
                }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   306
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   307
            return null;
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
        /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   311
         * Finds a resource of the given name in the patched module.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   312
         */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   313
        public Resource findResource(String name) throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   314
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   315
            // patch locations
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   316
            Resource r = findResourceInPatch(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   317
            if (r != null)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   318
                return r;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   319
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   320
            // original module
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   321
            ByteBuffer bb = delegate().read(name).orElse(null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   322
            if (bb == null)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   323
                return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   324
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   325
            return new Resource() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   326
                private <T> T shouldNotGetHere(Class<T> type) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   327
                    throw new InternalError("should not get here");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   328
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   329
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   330
                public String getName() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   331
                    return shouldNotGetHere(String.class);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   332
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   333
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   334
                public URL getURL() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   335
                    return shouldNotGetHere(URL.class);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   336
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   337
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   338
                public URL getCodeSourceURL() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   339
                    return delegateCodeSourceURL;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   340
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   341
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   342
                public ByteBuffer getByteBuffer() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   343
                    return bb;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   344
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   345
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   346
                public InputStream getInputStream() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   347
                    return shouldNotGetHere(InputStream.class);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   348
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   349
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   350
                public int getContentLength() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   351
                    return shouldNotGetHere(int.class);
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
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   356
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   357
        public Optional<URI> find(String name) throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   358
            Resource r = findResourceInPatch(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   359
            if (r != null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   360
                URI uri = URI.create(r.getURL().toString());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   361
                return Optional.of(uri);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   362
            } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   363
                return delegate().find(name);
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
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   367
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   368
        public Optional<InputStream> open(String name) throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   369
            Resource r = findResourceInPatch(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   370
            if (r != null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   371
                return Optional.of(r.getInputStream());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   372
            } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   373
                return delegate().open(name);
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
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   377
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   378
        public Optional<ByteBuffer> read(String name) throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   379
            Resource r = findResourceInPatch(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   380
            if (r != null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   381
                ByteBuffer bb = r.getByteBuffer();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   382
                assert !bb.isDirect();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   383
                return Optional.of(bb);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   384
            } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   385
                return delegate().read(name);
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
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   389
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   390
        public void release(ByteBuffer bb) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   391
            if (bb.isDirect()) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   392
                try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   393
                    delegate().release(bb);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   394
                } catch (IOException ioe) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   395
                    throw new InternalError(ioe);
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
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   400
        @Override
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   401
        public Stream<String> list() throws IOException {
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   402
            Stream<String> s = delegate().list();
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   403
            for (ResourceFinder finder : finders) {
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   404
                s = Stream.concat(s, finder.list());
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   405
            }
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   406
            return s.distinct();
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
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   409
        @Override
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   410
        public void close() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   411
            closeAll(finders);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   412
            delegate().close();
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
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   418
     * A resource finder that find resources in a patch location.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   419
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   420
    private static interface ResourceFinder extends Closeable {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   421
        Resource find(String name) throws IOException;
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   422
        Stream<String> list() throws IOException;
36511
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
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   427
     * A ResourceFinder that finds resources in a JAR file.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   428
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   429
    private static class JarResourceFinder implements ResourceFinder {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   430
        private final JarFile jf;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   431
        private final URL csURL;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   432
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   433
        JarResourceFinder(Path path) throws IOException {
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   434
            this.jf = new JarFile(path.toString());
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   435
            this.csURL = path.toUri().toURL();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   436
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   437
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   438
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   439
        public void close() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   440
            jf.close();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   441
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   442
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   443
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   444
        public Resource find(String name) throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   445
            JarEntry entry = jf.getJarEntry(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   446
            if (entry == null)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   447
                return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   448
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   449
            return new Resource() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   450
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   451
                public String getName() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   452
                    return name;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   453
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   454
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   455
                public URL getURL() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   456
                    String encodedPath = ParseUtil.encodePath(name, false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   457
                    try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   458
                        return new URL("jar:" + csURL + "!/" + encodedPath);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   459
                    } catch (MalformedURLException e) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   460
                        return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   461
                    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   462
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   463
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   464
                public URL getCodeSourceURL() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   465
                    return csURL;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   466
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   467
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   468
                public ByteBuffer getByteBuffer() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   469
                    byte[] bytes = getInputStream().readAllBytes();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   470
                    return ByteBuffer.wrap(bytes);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   471
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   472
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   473
                public InputStream getInputStream() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   474
                    return jf.getInputStream(entry);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   475
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   476
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   477
                public int getContentLength() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   478
                    long size = entry.getSize();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   479
                    return (size > Integer.MAX_VALUE) ? -1 : (int) size;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   480
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   481
            };
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   482
        }
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   483
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   484
        @Override
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   485
        public Stream<String> list() throws IOException {
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   486
            return jf.stream().map(JarEntry::getName);
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   487
        }
36511
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
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   492
     * A ResourceFinder that finds resources on the file system.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   493
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   494
    private static class ExplodedResourceFinder implements ResourceFinder {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   495
        private final Path dir;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   496
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   497
        ExplodedResourceFinder(Path dir) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   498
            this.dir = dir;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   499
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   500
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   501
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   502
        public void close() { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   503
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   504
        @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   505
        public Resource find(String name) throws IOException {
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   506
            Path file = Resources.toFilePath(dir, name);
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   507
            if (file != null) {
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   508
                return newResource(name, dir, file);
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   509
            } else {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   510
                return null;
36511
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
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   514
        private Resource newResource(String name, Path top, Path file) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   515
            return new Resource() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   516
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   517
                public String getName() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   518
                    return name;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   519
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   520
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   521
                public URL getURL() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   522
                    try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   523
                        return file.toUri().toURL();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   524
                    } catch (IOException | IOError e) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   525
                        return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   526
                    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   527
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   528
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   529
                public URL getCodeSourceURL() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   530
                    try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   531
                        return top.toUri().toURL();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   532
                    } catch (IOException | IOError e) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   533
                        return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   534
                    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   535
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   536
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   537
                public ByteBuffer getByteBuffer() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   538
                    return ByteBuffer.wrap(Files.readAllBytes(file));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   539
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   540
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   541
                public InputStream getInputStream() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   542
                    return Files.newInputStream(file);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   543
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   544
                @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   545
                public int getContentLength() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   546
                    long size = Files.size(file);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   547
                    return (size > Integer.MAX_VALUE) ? -1 : (int)size;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   548
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   549
            };
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   550
        }
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   551
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   552
        @Override
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   553
        public Stream<String> list() throws IOException {
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   554
            return Files.walk(dir, Integer.MAX_VALUE)
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   555
                        .map(f -> Resources.toResourceName(dir, f))
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   556
                        .filter(s -> s.length() > 0);
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   557
        }
36511
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
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   561
    /**
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   562
     * 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
   563
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   564
    private static String toPackageName(Path top, Path file) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   565
        Path entry = top.relativize(file);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   566
        Path parent = entry.getParent();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   567
        if (parent == null) {
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   568
            return warnIfModuleInfo(top, entry.toString());
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   569
        } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   570
            return parent.toString().replace(File.separatorChar, '.');
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
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   574
    /**
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   575
     * 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
   576
     */
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   577
    private boolean isHidden(Path file) {
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   578
        try {
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   579
            return Files.isHidden(file);
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   580
        } catch (IOException ioe) {
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   581
            return false;
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
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44359
diff changeset
   585
    /**
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   586
     * Derives a package name from the name of an entry in a JAR file.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   587
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   588
    private static String toPackageName(Path file, JarEntry entry) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   589
        String name = entry.getName();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   590
        int index = name.lastIndexOf("/");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   591
        if (index == -1) {
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   592
            return warnIfModuleInfo(file, name);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   593
        } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   594
            return name.substring(0, index).replace('/', '.');
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   595
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   596
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   597
41817
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   598
    private static String warnIfModuleInfo(Path file, String e) {
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   599
        if (e.equals("module-info.class"))
b90ad1de93ea 8168789: ModuleReader.list and ModuleFinder.of update
alanb
parents: 40261
diff changeset
   600
            System.err.println("WARNING: " + e + " ignored in patch: " + file);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   601
        return "";
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   602
    }
36674
7ab530dd6f10 8149122: Move sun.misc.URLClassPath and Resouce to an internal package
chegar
parents: 36511
diff changeset
   603
}