jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModulePoolImpl.java
author jlaskey
Tue, 28 Jun 2016 16:07:23 -0300
changeset 39308 f6517755057f
parent 39151 34455cc82f5e
child 39635 07c4b195280d
permissions -rw-r--r--
8160459: jlink minor code clean up Reviewed-by: mchung
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     1
/*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     2
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
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.tools.jlink.internal;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    26
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    27
import java.lang.module.ModuleDescriptor;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    28
import java.nio.ByteBuffer;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    29
import java.nio.ByteOrder;
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    30
import java.util.Collections;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    31
import java.util.HashMap;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    32
import java.util.HashSet;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    33
import java.util.LinkedHashMap;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    34
import java.util.Map;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    35
import java.util.Objects;
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    36
import java.util.Optional;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    37
import java.util.Set;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    38
import java.util.function.Function;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    39
import java.util.stream.Stream;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    40
import jdk.internal.jimage.decompressor.CompressedResourceHeader;
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    41
import jdk.tools.jlink.plugin.ModulePool;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    42
import jdk.tools.jlink.plugin.LinkModule;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    43
import jdk.tools.jlink.plugin.ModuleEntry;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    44
import jdk.tools.jlink.plugin.PluginException;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    45
import jdk.tools.jlink.internal.plugins.FileCopierPlugin;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    46
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    47
/**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    48
 * Pool of module data.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    49
 */
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    50
public class ModulePoolImpl implements ModulePool {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    51
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    52
    private class ModuleImpl implements LinkModule {
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    53
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    54
        final Map<String, ModuleEntry> moduleContent = new LinkedHashMap<>();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    55
        private ModuleDescriptor descriptor;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    56
        final String name;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    57
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    58
        private ModuleImpl(String name) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    59
            this.name = name;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    60
        }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    61
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    62
        @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    63
        public String getName() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    64
            return name;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    65
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    66
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    67
        @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    68
        public Optional<ModuleEntry> findEntry(String path) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    69
            if (!path.startsWith("/")) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    70
                path = "/" + path;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    71
            }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    72
            if (!path.startsWith("/" + name)) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    73
                path = "/" + name + path;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    74
            }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    75
            return Optional.ofNullable(moduleContent.get(path));
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    76
        }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    77
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    78
        @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    79
        public ModuleDescriptor getDescriptor() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    80
            if (descriptor == null) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    81
                String p = "/" + name + "/module-info.class";
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    82
                Optional<ModuleEntry> content = findEntry(p);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    83
                if (!content.isPresent()) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    84
                    throw new PluginException("No module-info for " + name
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    85
                            + " module");
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    86
                }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    87
                ByteBuffer bb = ByteBuffer.wrap(content.get().getBytes());
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    88
                descriptor = ModuleDescriptor.read(bb);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    89
            }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    90
            return descriptor;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    91
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    92
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    93
        @Override
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    94
        public void add(ModuleEntry data) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    95
            if (isReadOnly()) {
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
    96
                throw new PluginException("ModulePool is readonly");
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    97
            }
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    98
            Objects.requireNonNull(data);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
    99
            if (!data.getModule().equals(name)) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   100
                throw new PluginException("Can't add resource " + data.getPath()
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   101
                        + " to module " + name);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   102
            }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   103
            ModulePoolImpl.this.add(data);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   104
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   105
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   106
        @Override
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   107
        public Set<String> getAllPackages() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   108
            Set<String> pkgs = new HashSet<>();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   109
            moduleContent.values().stream().filter(m -> m.getType().
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   110
                    equals(ModuleEntry.Type.CLASS_OR_RESOURCE)).forEach(res -> {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   111
                // Module metadata only contains packages with .class files
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   112
                if (ImageFileCreator.isClassPackage(res.getPath())) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   113
                    String[] split = ImageFileCreator.splitPath(res.getPath());
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   114
                    String pkg = split[1];
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   115
                    if (pkg != null && !pkg.isEmpty()) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   116
                        pkgs.add(pkg);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   117
                    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   118
                }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   119
            });
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   120
            return pkgs;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   121
        }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   122
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   123
        @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   124
        public String toString() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   125
            return getName();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   126
        }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   127
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   128
        @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   129
        public Stream<? extends ModuleEntry> entries() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   130
            return moduleContent.values().stream();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   131
        }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   132
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   133
        @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   134
        public int getEntryCount() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   135
            return moduleContent.values().size();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   136
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   137
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   138
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   139
    private final Map<String, ModuleEntry> resources = new LinkedHashMap<>();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   140
    private final Map<String, ModuleImpl> modules = new LinkedHashMap<>();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   141
    private final ModuleImpl fileCopierModule = new ModuleImpl(FileCopierPlugin.FAKE_MODULE);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   142
    private Map<String, String> releaseProps = new HashMap<>();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   143
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   144
    private final ByteOrder order;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   145
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   146
    private boolean isReadOnly;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   147
    private final StringTable table;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   148
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   149
    public ModulePoolImpl() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   150
        this(ByteOrder.nativeOrder());
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   151
    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   152
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   153
    public ModulePoolImpl(ByteOrder order) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   154
        this(order, new StringTable() {
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   155
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   156
            @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   157
            public int addString(String str) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   158
                return -1;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   159
            }
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   160
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   161
            @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   162
            public String getString(int id) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   163
                return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   164
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   165
        });
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   166
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   167
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   168
    public ModulePoolImpl(ByteOrder order, StringTable table) {
39308
f6517755057f 8160459: jlink minor code clean up
jlaskey
parents: 39151
diff changeset
   169
        this.order = Objects.requireNonNull(order);
f6517755057f 8160459: jlink minor code clean up
jlaskey
parents: 39151
diff changeset
   170
        this.table = Objects.requireNonNull(table);
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   171
    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   172
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   173
    /**
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   174
     * Add a ModuleEntry.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   175
     *
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   176
     * @param data The ModuleEntry to add.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   177
     */
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   178
    @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   179
    public void add(ModuleEntry data) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   180
        if (isReadOnly()) {
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   181
            throw new PluginException("ModulePool is readonly");
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   182
        }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   183
        Objects.requireNonNull(data);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   184
        if (resources.get(data.getPath()) != null) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   185
            throw new PluginException("Resource " + data.getPath()
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   186
                    + " already present");
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   187
        }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   188
        String modulename = data.getModule();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   189
        ModuleImpl m = modules.get(modulename);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   190
        // ## TODO: FileCopierPlugin should not add content to a module
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   191
        // FAKE_MODULE is not really a module to be added in the image
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   192
        if (FileCopierPlugin.FAKE_MODULE.equals(modulename)) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   193
            m = fileCopierModule;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   194
        }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   195
        if (m == null) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   196
            m = new ModuleImpl(modulename);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   197
            modules.put(modulename, m);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   198
        }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   199
        resources.put(data.getPath(), data);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   200
        m.moduleContent.put(data.getPath(), data);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   201
    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   202
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   203
    /**
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   204
     * Retrieves the module for the provided name.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   205
     *
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   206
     * @param name The module name
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   207
     * @return the module of matching name, if found
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   208
     */
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   209
    @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   210
    public Optional<LinkModule> findModule(String name) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   211
        Objects.requireNonNull(name);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   212
        return Optional.ofNullable(modules.get(name));
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   213
    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   214
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   215
    /**
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   216
     * The stream of modules contained in this ModulePool.
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   217
     *
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   218
     * @return The stream of modules.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   219
     */
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   220
    @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   221
    public Stream<? extends LinkModule> modules() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   222
        return modules.values().stream();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   223
    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   224
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   225
    /**
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   226
     * Return the number of LinkModule count in this ModulePool.
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   227
     *
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   228
     * @return the module count.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   229
     */
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   230
    @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   231
    public int getModuleCount() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   232
        return modules.size();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   233
    }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   234
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   235
    /**
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   236
     * Get all ModuleEntry contained in this ModulePool instance.
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   237
     *
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   238
     * @return The stream of LinkModuleEntries.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   239
     */
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   240
    @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   241
    public Stream<? extends ModuleEntry> entries() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   242
        return resources.values().stream();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   243
    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   244
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   245
    /**
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   246
     * Return the number of ModuleEntry count in this ModulePool.
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   247
     *
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   248
     * @return the entry count.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   249
     */
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   250
    @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   251
    public int getEntryCount() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   252
        return resources.values().size();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   253
    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   254
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   255
    /**
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   256
     * Get the ModuleEntry for the passed path.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   257
     *
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   258
     * @param path A data path
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   259
     * @return A ModuleEntry instance or null if the data is not found
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   260
     */
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   261
    @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   262
    public Optional<ModuleEntry> findEntry(String path) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   263
        Objects.requireNonNull(path);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   264
        return Optional.ofNullable(resources.get(path));
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   265
    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   266
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   267
    /**
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   268
     * Check if the ModulePool contains the given ModuleEntry.
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   269
     *
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   270
     * @param data The module data to check existence for.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   271
     * @return The module data or null if not found.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   272
     */
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   273
    @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   274
    public boolean contains(ModuleEntry data) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   275
        Objects.requireNonNull(data);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   276
        return findEntry(data.getPath()).isPresent();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   277
    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   278
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   279
    /**
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   280
     * Check if the ModulePool contains some content at all.
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   281
     *
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   282
     * @return True, no content, false otherwise.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   283
     */
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   284
    @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   285
    public boolean isEmpty() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   286
        return resources.isEmpty();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   287
    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   288
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   289
    /**
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   290
     * Visit each ModuleEntry in this ModulePool to transform it and
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   291
     * copy the transformed ModuleEntry to the output ModulePool.
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   292
     *
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   293
     * @param transform The function called for each ModuleEntry found in
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   294
     * the ModulePool. The transform function should return a
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   295
     * ModuleEntry instance which will be added to the output or it should
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   296
     * return null if the passed ModuleEntry is to be ignored for the
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   297
     * output.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   298
     *
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   299
     * @param output The ModulePool to be filled with Visitor returned
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   300
     * ModuleEntry.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   301
     */
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   302
    @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   303
    public void transformAndCopy(Function<ModuleEntry, ModuleEntry> transform,
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   304
            ModulePool output) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   305
        entries().forEach(resource -> {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   306
            ModuleEntry res = transform.apply(resource);
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   307
            if (res != null) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   308
                output.add(res);
36511
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
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   312
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   313
    /**
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   314
     * The ByteOrder currently in use when generating the jimage file.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   315
     *
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   316
     * @return The ByteOrder.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   317
     */
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   318
    @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   319
    public ByteOrder getByteOrder() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   320
        return order;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   321
    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   322
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   323
    @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   324
    public Map<String, String> getReleaseProperties() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   325
        return isReadOnly()? Collections.unmodifiableMap(releaseProps) : releaseProps;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   326
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   327
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   328
    public StringTable getStringTable() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   329
        return table;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   330
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   331
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   332
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   333
     * Make this Resources instance read-only. No resource can be added.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   334
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   335
    public void setReadOnly() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   336
        isReadOnly = true;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   337
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   338
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   339
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   340
     * Read only state.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   341
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   342
     * @return true if readonly false otherwise.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   343
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   344
    @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   345
    public boolean isReadOnly() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   346
        return isReadOnly;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   347
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   348
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   349
    /**
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   350
     * A resource that has been compressed.
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   351
     */
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   352
    public static final class CompressedModuleData extends ByteArrayModuleEntry {
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   353
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   354
        final long uncompressed_size;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   355
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   356
        private CompressedModuleData(String module, String path,
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   357
                byte[] content, long uncompressed_size) {
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   358
            super(module, path, ModuleEntry.Type.CLASS_OR_RESOURCE, content);
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   359
            this.uncompressed_size = uncompressed_size;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   360
        }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   361
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   362
        public long getUncompressedSize() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   363
            return uncompressed_size;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   364
        }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   365
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   366
        @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   367
        public boolean equals(Object other) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   368
            if (!(other instanceof CompressedModuleData)) {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   369
                return false;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   370
            }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   371
            CompressedModuleData f = (CompressedModuleData) other;
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   372
            return f.getPath().equals(getPath());
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   373
        }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   374
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   375
        @Override
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   376
        public int hashCode() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   377
            return super.hashCode();
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   378
        }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   379
    }
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   380
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36511
diff changeset
   381
    public static CompressedModuleData newCompressedResource(ModuleEntry original,
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   382
            ByteBuffer compressed,
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   383
            String plugin, String pluginConfig, StringTable strings,
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   384
            ByteOrder order) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   385
        Objects.requireNonNull(original);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   386
        Objects.requireNonNull(compressed);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   387
        Objects.requireNonNull(plugin);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   388
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   389
        boolean isTerminal = !(original instanceof CompressedModuleData);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   390
        long uncompressed_size = original.getLength();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   391
        if (original instanceof CompressedModuleData) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   392
            CompressedModuleData comp = (CompressedModuleData) original;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   393
            uncompressed_size = comp.getUncompressedSize();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   394
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   395
        int nameOffset = strings.addString(plugin);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   396
        int configOffset = -1;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   397
        if (pluginConfig != null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   398
            configOffset = strings.addString(plugin);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   399
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   400
        CompressedResourceHeader rh
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   401
                = new CompressedResourceHeader(compressed.limit(), original.getLength(),
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   402
                        nameOffset, configOffset, isTerminal);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   403
        // Merge header with content;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   404
        byte[] h = rh.getBytes(order);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   405
        ByteBuffer bb = ByteBuffer.allocate(compressed.limit() + h.length);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   406
        bb.order(order);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   407
        bb.put(h);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   408
        bb.put(compressed);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   409
        byte[] contentWithHeader = bb.array();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   410
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   411
        CompressedModuleData compressedResource
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   412
                = new CompressedModuleData(original.getModule(), original.getPath(),
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 38320
diff changeset
   413
                        contentWithHeader, uncompressed_size);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   414
        return compressedResource;
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
}