jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java
author martin
Tue, 15 Sep 2015 21:56:04 -0700
changeset 32649 2ee9017c7597
parent 31673 135283550686
child 36511 9d0388c6b336
permissions -rw-r--r--
8136583: Core libraries should use blessed modifier order Summary: Run blessed-modifier-order script (see bug) Reviewed-by: psandoz, chegar, alanb, plevart
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     1
/*
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     2
 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     4
 *
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    10
 *
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    15
 * accompanied this code).
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    16
 *
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    20
 *
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    23
 * questions.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    24
 */
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    25
package jdk.internal.jimage;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    26
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    27
import java.io.IOException;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    28
import java.io.UncheckedIOException;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    29
import java.nio.ByteBuffer;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    30
import java.nio.ByteOrder;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    31
import java.nio.IntBuffer;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    32
import java.nio.file.Files;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    33
import java.nio.file.attribute.BasicFileAttributes;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    34
import java.nio.file.attribute.FileTime;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    35
import java.nio.file.Paths;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    36
import java.nio.file.Path;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    37
import java.util.ArrayList;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    38
import java.util.Collections;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    39
import java.util.HashMap;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    40
import java.util.List;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    41
import java.util.Map;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    42
import java.util.function.Consumer;
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    43
import static jdk.internal.jimage.UTF8String.*;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    44
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    45
public class ImageReader extends BasicImageReader {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    46
    // well-known strings needed for image file system.
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    47
    static final UTF8String ROOT_STRING = UTF8String.SLASH_STRING;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    48
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    49
    // attributes of the .jimage file. jimage file does not contain
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    50
    // attributes for the individual resources (yet). We use attributes
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    51
    // of the jimage file itself (creation, modification, access times).
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    52
    // Iniitalized lazily, see {@link #imageFileAttributes()}.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    53
    private BasicFileAttributes imageFileAttributes;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    54
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    55
    private final ImageModuleData moduleData;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    56
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    57
    // directory management implementation
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    58
    private final Map<UTF8String, Node> nodes;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    59
    private volatile Directory rootDir;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    60
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    61
    private Directory packagesDir;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    62
    private Directory modulesDir;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    63
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    64
    ImageReader(String imagePath, ByteOrder byteOrder) throws IOException {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    65
        super(imagePath, byteOrder);
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    66
        this.moduleData = new ImageModuleData(this);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    67
        this.nodes = Collections.synchronizedMap(new HashMap<>());
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    68
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    69
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    70
    ImageReader(String imagePath) throws IOException {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    71
        this(imagePath, ByteOrder.nativeOrder());
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    72
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    73
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    74
    public static ImageReader open(String imagePath, ByteOrder byteOrder) throws IOException {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    75
        return new ImageReader(imagePath, byteOrder);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    76
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    77
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    78
    /**
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    79
     * Opens the given file path as an image file, returning an {@code ImageReader}.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    80
     */
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    81
    public static ImageReader open(String imagePath) throws IOException {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    82
        return open(imagePath, ByteOrder.nativeOrder());
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    83
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    84
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    85
    @Override
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    86
    public synchronized void close() throws IOException {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    87
        super.close();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    88
        clearNodes();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    89
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    90
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    91
    @Override
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    92
    public ImageLocation findLocation(UTF8String name) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    93
        ImageLocation location = super.findLocation(name);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    94
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    95
        // NOTE: This should be removed when module system is up in full.
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    96
        if (location == null) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    97
            int index = name.lastIndexOf('/');
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    98
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    99
            if (index != -1) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   100
                UTF8String packageName = name.substring(0, index);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   101
                UTF8String moduleName = moduleData.packageToModule(packageName);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   102
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   103
                if (moduleName != null) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   104
                    UTF8String fullName = UTF8String.SLASH_STRING.concat(moduleName,
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   105
                            UTF8String.SLASH_STRING, name);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   106
                    location = super.findLocation(fullName);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   107
                }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   108
            } else {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   109
                // No package, try all modules.
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   110
                for (String mod : moduleData.allModuleNames()) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   111
                    location = super.findLocation("/" + mod + "/" + name);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   112
                    if (location != null) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   113
                        break;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   114
                    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   115
                }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   116
            }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   117
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   118
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   119
        return location;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   120
    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   121
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   122
    /**
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   123
     * Return the module name that contains the given package name.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   124
     */
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   125
    public String getModule(String packageName) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   126
        return moduleData.packageToModule(packageName);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   127
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   128
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   129
    // jimage file does not store directory structure. We build nodes
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   130
    // using the "path" strings found in the jimage file.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   131
    // Node can be a directory or a resource
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 31673
diff changeset
   132
    public abstract static class Node {
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   133
        private static final int ROOT_DIR = 0b0000_0000_0000_0001;
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   134
        private static final int PACKAGES_DIR = 0b0000_0000_0000_0010;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   135
        private static final int MODULES_DIR = 0b0000_0000_0000_0100;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   136
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   137
        private int flags;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   138
        private final UTF8String name;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   139
        private final BasicFileAttributes fileAttrs;
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   140
        private boolean completed;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   141
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   142
        Node(UTF8String name, BasicFileAttributes fileAttrs) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   143
            assert name != null;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   144
            assert fileAttrs != null;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   145
            this.name = name;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   146
            this.fileAttrs = fileAttrs;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   147
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   148
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   149
        /**
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   150
         * A node is completed when all its direct children have been built.
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   151
         *
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   152
         * @return
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   153
         */
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   154
        public boolean isCompleted() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   155
            return completed;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   156
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   157
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   158
        public void setCompleted(boolean completed) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   159
            this.completed = completed;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   160
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   161
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   162
        public final void setIsRootDir() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   163
            flags |= ROOT_DIR;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   164
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   165
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   166
        public final boolean isRootDir() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   167
            return (flags & ROOT_DIR) != 0;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   168
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   169
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   170
        public final void setIsPackagesDir() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   171
            flags |= PACKAGES_DIR;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   172
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   173
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   174
        public final boolean isPackagesDir() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   175
            return (flags & PACKAGES_DIR) != 0;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   176
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   177
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   178
        public final void setIsModulesDir() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   179
            flags |= MODULES_DIR;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   180
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   181
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   182
        public final boolean isModulesDir() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   183
            return (flags & MODULES_DIR) != 0;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   184
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   185
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   186
        public final UTF8String getName() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   187
            return name;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   188
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   189
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   190
        public final BasicFileAttributes getFileAttributes() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   191
            return fileAttrs;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   192
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   193
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   194
        // resolve this Node (if this is a soft link, get underlying Node)
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   195
        public final Node resolveLink() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   196
            return resolveLink(false);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   197
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   198
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   199
        public Node resolveLink(boolean recursive) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   200
            return this;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   201
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   202
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   203
        // is this a soft link Node?
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   204
        public boolean isLink() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   205
            return false;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   206
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   207
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   208
        public boolean isDirectory() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   209
            return false;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   210
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   211
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   212
        public List<Node> getChildren() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   213
            throw new IllegalArgumentException("not a directory: " + getNameString());
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   214
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   215
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   216
        public boolean isResource() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   217
            return false;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   218
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   219
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   220
        public ImageLocation getLocation() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   221
            throw new IllegalArgumentException("not a resource: " + getNameString());
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   222
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   223
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   224
        public long size() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   225
            return 0L;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   226
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   227
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   228
        public long compressedSize() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   229
            return 0L;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   230
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   231
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   232
        public String extension() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   233
            return null;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   234
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   235
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   236
        public long contentOffset() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   237
            return 0L;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   238
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   239
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   240
        public final FileTime creationTime() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   241
            return fileAttrs.creationTime();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   242
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   243
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   244
        public final FileTime lastAccessTime() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   245
            return fileAttrs.lastAccessTime();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   246
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   247
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   248
        public final FileTime lastModifiedTime() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   249
            return fileAttrs.lastModifiedTime();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   250
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   251
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   252
        public final String getNameString() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   253
            return name.toString();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   254
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   255
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   256
        @Override
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   257
        public final String toString() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   258
            return getNameString();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   259
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   260
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   261
        @Override
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   262
        public final int hashCode() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   263
            return name.hashCode();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   264
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   265
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   266
        @Override
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   267
        public final boolean equals(Object other) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   268
            if (this == other) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   269
                return true;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   270
            }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   271
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   272
            if (other instanceof Node) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   273
                return name.equals(((Node) other).name);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   274
            }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   275
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   276
            return false;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   277
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   278
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   279
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   280
    // directory node - directory has full path name without '/' at end.
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   281
    static final class Directory extends Node {
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   282
        private final List<Node> children;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   283
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   284
        private Directory(Directory parent, UTF8String name, BasicFileAttributes fileAttrs) {
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   285
            super(name, fileAttrs);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   286
            children = new ArrayList<>();
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   287
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   288
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   289
        static Directory create(Directory parent, UTF8String name, BasicFileAttributes fileAttrs) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   290
            Directory dir = new Directory(parent, name, fileAttrs);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   291
            if (parent != null) {
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   292
                parent.addChild(dir);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   293
            }
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   294
            return dir;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   295
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   296
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   297
        @Override
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   298
        public boolean isDirectory() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   299
            return true;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   300
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   301
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   302
        @Override
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   303
        public List<Node> getChildren() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   304
            return Collections.unmodifiableList(children);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   305
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   306
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   307
        void addChild(Node node) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   308
            children.add(node);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   309
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   310
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   311
        public void walk(Consumer<? super Node> consumer) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   312
            consumer.accept(this);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   313
            for ( Node child : children ) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   314
                if (child.isDirectory()) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   315
                    ((Directory)child).walk(consumer);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   316
                } else {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   317
                    consumer.accept(child);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   318
                }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   319
            }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   320
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   321
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   322
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   323
    // "resource" is .class or any other resource (compressed/uncompressed) in a jimage.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   324
    // full path of the resource is the "name" of the resource.
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   325
    static class Resource extends Node {
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   326
        private final ImageLocation loc;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   327
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   328
        private Resource(Directory parent, ImageLocation loc, BasicFileAttributes fileAttrs) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   329
            this(parent, loc.getFullName(true), loc, fileAttrs);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   330
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   331
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   332
        private Resource(Directory parent, UTF8String name, ImageLocation loc, BasicFileAttributes fileAttrs) {
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   333
            super(name, fileAttrs);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   334
            this.loc = loc;
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   335
         }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   336
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   337
        static Resource create(Directory parent, ImageLocation loc, BasicFileAttributes fileAttrs) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   338
            Resource resource = new Resource(parent, loc, fileAttrs);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   339
            parent.addChild(resource);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   340
            return resource;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   341
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   342
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   343
        static Resource create(Directory parent, UTF8String name, ImageLocation loc, BasicFileAttributes fileAttrs) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   344
            Resource resource = new Resource(parent, name, loc, fileAttrs);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   345
            parent.addChild(resource);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   346
            return resource;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   347
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   348
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   349
        @Override
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   350
        public boolean isCompleted() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   351
            return true;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   352
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   353
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   354
        @Override
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   355
        public boolean isResource() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   356
            return true;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   357
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   358
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   359
        @Override
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   360
        public ImageLocation getLocation() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   361
            return loc;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   362
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   363
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   364
        @Override
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   365
        public long size() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   366
            return loc.getUncompressedSize();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   367
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   368
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   369
        @Override
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   370
        public long compressedSize() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   371
            return loc.getCompressedSize();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   372
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   373
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   374
        @Override
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   375
        public String extension() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   376
            return loc.getExtensionString();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   377
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   378
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   379
        @Override
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   380
        public long contentOffset() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   381
            return loc.getContentOffset();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   382
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   383
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   384
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   385
    // represents a soft link to another Node
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   386
    static class LinkNode extends Node {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   387
        private final Node link;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   388
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   389
        private LinkNode(Directory parent, UTF8String name, Node link) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   390
            super(name, link.getFileAttributes());
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   391
            this.link = link;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   392
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   393
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   394
        static LinkNode create(Directory parent, UTF8String name, Node link) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   395
            LinkNode linkNode = new LinkNode(parent, name, link);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   396
            parent.addChild(linkNode);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   397
            return linkNode;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   398
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   399
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   400
        @Override
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   401
        public boolean isCompleted() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   402
            return true;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   403
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   404
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   405
        @Override
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   406
        public Node resolveLink(boolean recursive) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   407
            return recursive && (link instanceof LinkNode)? ((LinkNode)link).resolveLink(true) : link;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   408
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   409
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   410
        @Override
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   411
        public boolean isLink() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   412
            return true;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   413
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   414
    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   415
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   416
    // directory management interface
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   417
    public Directory getRootDirectory() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   418
        return buildRootDirectory();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   419
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   420
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   421
    public Node findNode(String name) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   422
        return findNode(new UTF8String(name));
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   423
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   424
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   425
    public Node findNode(byte[] name) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   426
        return findNode(new UTF8String(name));
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   427
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   428
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   429
    /**
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   430
     * To visit sub tree resources.
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   431
     */
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   432
    interface LocationVisitor {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   433
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   434
        void visit(ImageLocation loc);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   435
    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   436
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   437
    /**
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   438
     * Lazily build a node from a name.
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   439
     */
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   440
    private final class NodeBuilder {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   441
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   442
        private static final int SIZE_OF_OFFSET = 4;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   443
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   444
        private final UTF8String name;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   445
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   446
        private NodeBuilder(UTF8String name) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   447
            this.name = name;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   448
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   449
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   450
        private Node buildNode() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   451
            Node n = null;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   452
            boolean isPackages = false;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   453
            boolean isModules = false;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   454
            String strName = name.toString();
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   455
            if (strName.startsWith("" + PACKAGES_STRING)) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   456
                isPackages = true;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   457
            } else {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   458
                if (strName.startsWith("" + MODULES_STRING)) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   459
                    isModules = true;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   460
                }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   461
            }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   462
            if (!isModules && !isPackages) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   463
                return null;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   464
            }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   465
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   466
            ImageLocation loc = findLocation(name);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   467
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   468
            if (loc != null) { // A sub tree node
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   469
                if (isPackages) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   470
                    n = handlePackages(strName, loc);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   471
                } else { // modules sub tree
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   472
                    n = handleModulesSubTree(strName, loc);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   473
                }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   474
            } else { // Asking for a resource? /modules/java.base/java/lang/Object.class
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   475
                if (isModules) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   476
                    n = handleResource(strName, loc);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   477
                }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   478
            }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   479
            return n;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   480
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   481
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   482
        private void visitLocation(ImageLocation loc, LocationVisitor visitor) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   483
            byte[] offsets = getResource(loc);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   484
            ByteBuffer buffer = ByteBuffer.wrap(offsets);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   485
            buffer.order(getByteOrder());
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   486
            IntBuffer intBuffer = buffer.asIntBuffer();
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   487
            for (int i = 0; i < offsets.length / SIZE_OF_OFFSET; i++) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   488
                int offset = intBuffer.get(i);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   489
                ImageLocation pkgLoc = getLocation(offset);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   490
                visitor.visit(pkgLoc);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   491
            }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   492
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   493
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   494
        private Node handlePackages(String name, ImageLocation loc) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   495
            long size = loc.getUncompressedSize();
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   496
            Node n = null;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   497
            // Only possiblities are /packages, /packages/package/module
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   498
            if (name.equals("" + PACKAGES_STRING)) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   499
                visitLocation(loc, (childloc) -> {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   500
                    findNode(childloc.getFullName());
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   501
                });
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   502
                packagesDir.setCompleted(true);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   503
                n = packagesDir;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   504
            } else {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   505
                if (size != 0) { // children are links to module
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   506
                    String pkgName = getBaseExt(loc);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   507
                    Directory pkgDir = newDirectory(packagesDir,
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   508
                            packagesDir.getName().concat(SLASH_STRING, new UTF8String(pkgName)));
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   509
                    visitLocation(loc, (childloc) -> {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   510
                        findNode(childloc.getFullName());
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   511
                    });
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   512
                    pkgDir.setCompleted(true);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   513
                    n = pkgDir;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   514
                } else { // Link to module
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   515
                    String pkgName = loc.getParentString();
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   516
                    String modName = getBaseExt(loc);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   517
                    Node targetNode = findNode(MODULES_STRING + "/" + modName);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   518
                    if (targetNode != null) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   519
                        UTF8String pkgDirName = packagesDir.getName().concat(SLASH_STRING, new UTF8String(pkgName));
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   520
                        Directory pkgDir = (Directory) nodes.get(pkgDirName);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   521
                        Node linkNode = newLinkNode(pkgDir,
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   522
                                pkgDir.getName().concat(SLASH_STRING, new UTF8String(modName)), targetNode);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   523
                        n = linkNode;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   524
                    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   525
                }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   526
            }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   527
            return n;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   528
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   529
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   530
        private Node handleModulesSubTree(String name, ImageLocation loc) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   531
            Node n;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   532
            Directory dir = makeDirectories(loc.getFullName());
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   533
            visitLocation(loc, (childloc) -> {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   534
                String path = childloc.getFullNameString();
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   535
                if (path.startsWith(MODULES_STRING.toString())) { // a package
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   536
                    makeDirectories(childloc.getFullName());
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   537
                } else { // a resource
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   538
                    makeDirectories(childloc.buildName(true, true, false));
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   539
                    newResource(dir, childloc);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   540
                }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   541
            });
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   542
            dir.setCompleted(true);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   543
            n = dir;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   544
            return n;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   545
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   546
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   547
        private Node handleResource(String name, ImageLocation loc) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   548
            Node n = null;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   549
            String locationPath = name.substring((MODULES_STRING).length());
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   550
            ImageLocation resourceLoc = findLocation(locationPath);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   551
            if (resourceLoc != null) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   552
                Directory dir = makeDirectories(resourceLoc.buildName(true, true, false));
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   553
                Resource res = newResource(dir, resourceLoc);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   554
                n = res;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   555
            }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   556
            return n;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   557
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   558
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   559
        private String getBaseExt(ImageLocation loc) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   560
            String base = loc.getBaseString();
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   561
            String ext = loc.getExtensionString();
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   562
            if (ext != null && !ext.isEmpty()) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   563
                base = base + "." + ext;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   564
            }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   565
            return base;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   566
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   567
    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   568
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   569
    public synchronized Node findNode(UTF8String name) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   570
        buildRootDirectory();
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   571
        Node n = nodes.get(name);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   572
        if (n == null || !n.isCompleted()) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   573
            NodeBuilder builder = new NodeBuilder(name);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   574
            n = builder.buildNode();
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   575
        }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   576
        return n;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   577
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   578
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   579
    private synchronized void clearNodes() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   580
        nodes.clear();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   581
        rootDir = null;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   582
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   583
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   584
    /**
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   585
     * Returns the file attributes of the image file.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   586
     */
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   587
    private BasicFileAttributes imageFileAttributes() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   588
        BasicFileAttributes attrs = imageFileAttributes;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   589
        if (attrs == null) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   590
            try {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   591
                Path file = Paths.get(imagePath());
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   592
                attrs = Files.readAttributes(file, BasicFileAttributes.class);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   593
            } catch (IOException ioe) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   594
                throw new UncheckedIOException(ioe);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   595
            }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   596
            imageFileAttributes = attrs;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   597
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   598
        return attrs;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   599
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   600
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   601
    private synchronized Directory buildRootDirectory() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   602
        if (rootDir != null) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   603
            return rootDir;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   604
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   605
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   606
        // FIXME no time information per resource in jimage file (yet?)
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   607
        // we use file attributes of jimage itself.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   608
        // root directory
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   609
        rootDir = newDirectory(null, ROOT_STRING);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   610
        rootDir.setIsRootDir();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   611
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   612
        // /packages dir
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   613
        packagesDir = newDirectory(rootDir, PACKAGES_STRING);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   614
        packagesDir.setIsPackagesDir();
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   615
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   616
        // /modules dir
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   617
        modulesDir = newDirectory(rootDir, MODULES_STRING);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   618
        modulesDir.setIsModulesDir();
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   619
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   620
        rootDir.setCompleted(true);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   621
        return rootDir;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   622
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   623
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   624
    private Directory newDirectory(Directory parent, UTF8String name) {
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   625
        Directory dir = Directory.create(parent, name, imageFileAttributes());
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   626
        nodes.put(dir.getName(), dir);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   627
        return dir;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   628
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   629
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   630
    private Resource newResource(Directory parent, ImageLocation loc) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   631
        Resource res = Resource.create(parent, loc, imageFileAttributes());
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   632
        nodes.put(res.getName(), res);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   633
        return res;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   634
    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   635
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   636
    private LinkNode newLinkNode(Directory dir, UTF8String name, Node link) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   637
        LinkNode linkNode = LinkNode.create(dir, name, link);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   638
        nodes.put(linkNode.getName(), linkNode);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   639
        return linkNode;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   640
    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   641
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   642
    private List<UTF8String> dirs(UTF8String parent) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   643
        List<UTF8String> splits = new ArrayList<>();
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   644
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   645
        for (int i = 1; i < parent.length(); i++) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   646
            if (parent.byteAt(i) == '/') {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   647
                splits.add(parent.substring(0, i));
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   648
            }
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   649
        }
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   650
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   651
        splits.add(parent);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   652
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   653
        return splits;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   654
    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   655
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   656
    private Directory makeDirectories(UTF8String parent) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   657
        Directory last = rootDir;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   658
        List<UTF8String> dirs = dirs(parent);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   659
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   660
        for (UTF8String dir : dirs) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   661
            Directory nextDir = (Directory) nodes.get(dir);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   662
            if (nextDir == null) {
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   663
                nextDir = newDirectory(last, dir);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   664
            }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   665
            last = nextDir;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   666
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   667
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   668
        return last;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   669
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   670
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   671
    public byte[] getResource(Node node) throws IOException {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   672
        if (node.isResource()) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   673
            return super.getResource(node.getLocation());
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   674
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   675
        throw new IOException("Not a resource: " + node);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   676
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   677
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   678
    public byte[] getResource(Resource rs) throws IOException {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   679
        return super.getResource(rs.getLocation());
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   680
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   681
}