jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java
author alanb
Thu, 04 May 2017 07:26:55 +0000
changeset 45004 ea3137042a61
parent 44545 83b611b88ac8
child 45281 122c607f82da
child 45339 f2ab1225d11f
permissions -rw-r--r--
8178380: Module system implementation refresh (5/2017) Reviewed-by: mchung, alanb, sspitsyn Contributed-by: alan.bateman@oracle.com, mandy.chung@oracle.com, chris.hegarty@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
     1
/*
43809
c3669a70a7ab 8174694: improve error message shown when main class can't be loaded
vromero
parents: 43713
diff changeset
     2
 * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
     4
 *
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2168
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2168
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    10
 *
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    15
 * accompanied this code).
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    16
 *
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2168
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2168
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2168
diff changeset
    23
 * questions.
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    24
 */
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    25
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    26
package sun.launcher;
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    27
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    28
/*
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    29
 *
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    30
 *  <p><b>This is NOT part of any API supported by Sun Microsystems.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    31
 *  If you write code that depends on this, you do so at your own
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    32
 *  risk.  This code and its internal interfaces are subject to change
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    33
 *  or deletion without notice.</b>
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    34
 *
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    35
 */
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    36
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    37
/**
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    38
 * A utility package for the java(1), javaw(1) launchers.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    39
 * The following are helper methods that the native launcher uses
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    40
 * to perform checks etc. using JNI, see src/share/bin/java.c
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    41
 */
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    42
import java.io.File;
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    43
import java.io.IOException;
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    44
import java.io.PrintStream;
8806
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
    45
import java.io.UnsupportedEncodingException;
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
    46
import java.lang.module.Configuration;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
    47
import java.lang.module.FindException;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
    48
import java.lang.module.ModuleDescriptor;
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
    49
import java.lang.module.ModuleDescriptor.Requires;
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
    50
import java.lang.module.ModuleDescriptor.Exports;
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
    51
import java.lang.module.ModuleDescriptor.Opens;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
    52
import java.lang.module.ModuleDescriptor.Provides;
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
    53
import java.lang.module.ModuleFinder;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
    54
import java.lang.module.ModuleReference;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
    55
import java.lang.module.ResolvedModule;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
    56
import java.lang.reflect.InvocationTargetException;
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    57
import java.lang.reflect.Method;
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    58
import java.lang.reflect.Modifier;
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
    59
import java.math.BigDecimal;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
    60
import java.math.RoundingMode;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
    61
import java.net.URI;
8806
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
    62
import java.nio.charset.Charset;
13411
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
    63
import java.nio.file.DirectoryStream;
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
    64
import java.nio.file.Files;
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
    65
import java.nio.file.NoSuchFileException;
13411
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
    66
import java.nio.file.Path;
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
    67
import java.nio.file.Paths;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
    68
import java.nio.file.attribute.BasicFileAttributes;
20179
fa41a3d5805e 8017248: Compiler Diacritics Issue
kizune
parents: 19409
diff changeset
    69
import java.text.Normalizer;
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    70
import java.text.MessageFormat;
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
    71
import java.util.ArrayList;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
    72
import java.util.Collections;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
    73
import java.util.Comparator;
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
    74
import java.util.HashMap;
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
    75
import java.util.Iterator;
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
    76
import java.util.List;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
    77
import java.util.Locale;
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
    78
import java.util.Locale.Category;
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
    79
import java.util.Map;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
    80
import java.util.Optional;
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
    81
import java.util.Properties;
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
    82
import java.util.ResourceBundle;
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
    83
import java.util.Set;
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
    84
import java.util.TreeSet;
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    85
import java.util.jar.Attributes;
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    86
import java.util.jar.JarFile;
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    87
import java.util.jar.Manifest;
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
    88
import java.util.stream.Collectors;
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
    89
import java.util.stream.Stream;
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
    90
34882
ce2a8ec851c1 8145544: Move sun.misc.VM to jdk.internal.misc
chegar
parents: 32649
diff changeset
    91
import jdk.internal.misc.VM;
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
    92
import jdk.internal.module.ModuleBootstrap;
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
    93
import jdk.internal.module.Modules;
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
    94
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
    95
37788
81ce381a91f6 8155939: sun.launcher.LauncherHelper INSTANCE is unused
redestad
parents: 36511
diff changeset
    96
public final class LauncherHelper {
81ce381a91f6 8155939: sun.launcher.LauncherHelper INSTANCE is unused
redestad
parents: 36511
diff changeset
    97
81ce381a91f6 8155939: sun.launcher.LauncherHelper INSTANCE is unused
redestad
parents: 36511
diff changeset
    98
    // No instantiation
81ce381a91f6 8155939: sun.launcher.LauncherHelper INSTANCE is unused
redestad
parents: 36511
diff changeset
    99
    private LauncherHelper() {}
24254
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   100
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   101
    // used to identify JavaFX applications
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   102
    private static final String JAVAFX_APPLICATION_MARKER =
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   103
            "JavaFX-Application-Class";
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   104
    private static final String JAVAFX_APPLICATION_CLASS_NAME =
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   105
            "javafx.application.Application";
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   106
    private static final String JAVAFX_FXHELPER_CLASS_NAME_SUFFIX =
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   107
            "sun.launcher.LauncherHelper$FXHelper";
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   108
    private static final String LAUNCHER_AGENT_CLASS = "Launcher-Agent-Class";
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   109
    private static final String MAIN_CLASS = "Main-Class";
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   110
    private static final String ADD_EXPORTS = "Add-Exports";
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   111
    private static final String ADD_OPENS = "Add-Opens";
15682
793a36de151d 8003255: (profiles) Update JAR file specification to support profiles
alanb
parents: 15003
diff changeset
   112
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   113
    private static StringBuilder outBuf = new StringBuilder();
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   114
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   115
    private static final String INDENT = "    ";
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   116
    private static final String VM_SETTINGS     = "VM settings:";
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   117
    private static final String PROP_SETTINGS   = "Property settings:";
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   118
    private static final String LOCALE_SETTINGS = "Locale settings:";
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   119
34882
ce2a8ec851c1 8145544: Move sun.misc.VM to jdk.internal.misc
chegar
parents: 32649
diff changeset
   120
    // sync with java.c and jdk.internal.misc.VM
8174
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   121
    private static final String diagprop = "sun.java.launcher.diag";
34882
ce2a8ec851c1 8145544: Move sun.misc.VM to jdk.internal.misc
chegar
parents: 32649
diff changeset
   122
    static final boolean trace = VM.getSavedProperty(diagprop) != null;
8174
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   123
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   124
    private static final String defaultBundleName =
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   125
            "sun.launcher.resources.launcher";
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   126
    private static class ResourceBundleHolder {
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   127
        private static final ResourceBundle RB =
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   128
                ResourceBundle.getBundle(defaultBundleName);
2168
de3c5a0416de 6801467: Defer get the launcher resource bundle until it's needed
mchung
parents: 1343
diff changeset
   129
    }
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   130
    private static PrintStream ostream;
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   131
    private static Class<?> appClass; // application class, for GUI/reporting purposes
2168
de3c5a0416de 6801467: Defer get the launcher resource bundle until it's needed
mchung
parents: 1343
diff changeset
   132
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   133
    /*
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   134
     * A method called by the launcher to print out the standard settings,
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   135
     * by default -XshowSettings is equivalent to -XshowSettings:all,
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   136
     * Specific information may be gotten by using suboptions with possible
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   137
     * values vm, properties and locale.
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   138
     *
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   139
     * printToStderr: choose between stdout and stderr
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   140
     *
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   141
     * optionFlag: specifies which options to print default is all other
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   142
     *    possible values are vm, properties, locale.
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   143
     *
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   144
     * initialHeapSize: in bytes, as set by the launcher, a zero-value indicates
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   145
     *    this code should determine this value, using a suitable method or
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   146
     *    the line could be omitted.
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   147
     *
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   148
     * maxHeapSize: in bytes, as set by the launcher, a zero-value indicates
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   149
     *    this code should determine this value, using a suitable method.
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   150
     *
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   151
     * stackSize: in bytes, as set by the launcher, a zero-value indicates
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   152
     *    this code determine this value, using a suitable method or omit the
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   153
     *    line entirely.
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   154
     */
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   155
    static void showSettings(boolean printToStderr, String optionFlag,
41966
bac52fa6e617 8169001: Remove launcher's built-in ergonomics
ksrini
parents: 40261
diff changeset
   156
            long initialHeapSize, long maxHeapSize, long stackSize) {
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   157
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   158
        initOutput(printToStderr);
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   159
        String opts[] = optionFlag.split(":");
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   160
        String optStr = (opts.length > 1 && opts[1] != null)
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   161
                ? opts[1].trim()
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   162
                : "all";
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   163
        switch (optStr) {
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   164
            case "vm":
41966
bac52fa6e617 8169001: Remove launcher's built-in ergonomics
ksrini
parents: 40261
diff changeset
   165
                printVmSettings(initialHeapSize, maxHeapSize, stackSize);
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   166
                break;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   167
            case "properties":
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   168
                printProperties();
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   169
                break;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   170
            case "locale":
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   171
                printLocale();
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   172
                break;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   173
            default:
41966
bac52fa6e617 8169001: Remove launcher's built-in ergonomics
ksrini
parents: 40261
diff changeset
   174
                printVmSettings(initialHeapSize, maxHeapSize, stackSize);
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   175
                printProperties();
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   176
                printLocale();
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   177
                break;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   178
        }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   179
    }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   180
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   181
    /*
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   182
     * prints the main vm settings subopt/section
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   183
     */
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   184
    private static void printVmSettings(
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   185
            long initialHeapSize, long maxHeapSize,
41966
bac52fa6e617 8169001: Remove launcher's built-in ergonomics
ksrini
parents: 40261
diff changeset
   186
            long stackSize) {
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   187
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   188
        ostream.println(VM_SETTINGS);
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   189
        if (stackSize != 0L) {
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   190
            ostream.println(INDENT + "Stack Size: " +
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   191
                    SizePrefix.scaleValue(stackSize));
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   192
        }
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   193
        if (initialHeapSize != 0L) {
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   194
             ostream.println(INDENT + "Min. Heap Size: " +
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   195
                    SizePrefix.scaleValue(initialHeapSize));
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   196
        }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   197
        if (maxHeapSize != 0L) {
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   198
            ostream.println(INDENT + "Max. Heap Size: " +
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   199
                    SizePrefix.scaleValue(maxHeapSize));
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   200
        } else {
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   201
            ostream.println(INDENT + "Max. Heap Size (Estimated): "
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   202
                    + SizePrefix.scaleValue(Runtime.getRuntime().maxMemory()));
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   203
        }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   204
        ostream.println(INDENT + "Using VM: "
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   205
                + System.getProperty("java.vm.name"));
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   206
        ostream.println();
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   207
    }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   208
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   209
    /*
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   210
     * prints the properties subopt/section
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   211
     */
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   212
    private static void printProperties() {
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   213
        Properties p = System.getProperties();
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   214
        ostream.println(PROP_SETTINGS);
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   215
        List<String> sortedPropertyKeys = new ArrayList<>();
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   216
        sortedPropertyKeys.addAll(p.stringPropertyNames());
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   217
        Collections.sort(sortedPropertyKeys);
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   218
        for (String x : sortedPropertyKeys) {
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   219
            printPropertyValue(x, p.getProperty(x));
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   220
        }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   221
        ostream.println();
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   222
    }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   223
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   224
    private static boolean isPath(String key) {
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   225
        return key.endsWith(".dirs") || key.endsWith(".path");
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   226
    }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   227
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   228
    private static void printPropertyValue(String key, String value) {
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   229
        ostream.print(INDENT + key + " = ");
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   230
        if (key.equals("line.separator")) {
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   231
            for (byte b : value.getBytes()) {
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   232
                switch (b) {
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   233
                    case 0xd:
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   234
                        ostream.print("\\r ");
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   235
                        break;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   236
                    case 0xa:
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   237
                        ostream.print("\\n ");
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   238
                        break;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   239
                    default:
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   240
                        // print any bizzare line separators in hex, but really
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   241
                        // shouldn't happen.
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   242
                        ostream.printf("0x%02X", b & 0xff);
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   243
                        break;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   244
                }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   245
            }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   246
            ostream.println();
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   247
            return;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   248
        }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   249
        if (!isPath(key)) {
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   250
            ostream.println(value);
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   251
            return;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   252
        }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   253
        String[] values = value.split(System.getProperty("path.separator"));
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   254
        boolean first = true;
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   255
        for (String s : values) {
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   256
            if (first) { // first line treated specially
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   257
                ostream.println(s);
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   258
                first = false;
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   259
            } else { // following lines prefix with indents
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   260
                ostream.println(INDENT + INDENT + s);
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   261
            }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   262
        }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   263
    }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   264
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   265
    /*
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   266
     * prints the locale subopt/section
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   267
     */
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   268
    private static void printLocale() {
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   269
        Locale locale = Locale.getDefault();
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   270
        ostream.println(LOCALE_SETTINGS);
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   271
        ostream.println(INDENT + "default locale = " +
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   272
                locale.getDisplayLanguage());
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   273
        ostream.println(INDENT + "default display locale = " +
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   274
                Locale.getDefault(Category.DISPLAY).getDisplayName());
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   275
        ostream.println(INDENT + "default format locale = " +
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   276
                Locale.getDefault(Category.FORMAT).getDisplayName());
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   277
        printLocales();
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   278
        ostream.println();
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   279
    }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   280
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   281
    private static void printLocales() {
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   282
        Locale[] tlocales = Locale.getAvailableLocales();
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   283
        final int len = tlocales == null ? 0 : tlocales.length;
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   284
        if (len < 1 ) {
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   285
            return;
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   286
        }
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   287
        // Locale does not implement Comparable so we convert it to String
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   288
        // and sort it for pretty printing.
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   289
        Set<String> sortedSet = new TreeSet<>();
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   290
        for (Locale l : tlocales) {
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   291
            sortedSet.add(l.toString());
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   292
        }
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   293
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   294
        ostream.print(INDENT + "available locales = ");
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   295
        Iterator<String> iter = sortedSet.iterator();
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   296
        final int last = len - 1;
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   297
        for (int i = 0 ; iter.hasNext() ; i++) {
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   298
            String s = iter.next();
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   299
            ostream.print(s);
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   300
            if (i != last) {
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   301
                ostream.print(", ");
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   302
            }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   303
            // print columns of 8
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   304
            if ((i + 1) % 8 == 0) {
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   305
                ostream.println();
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   306
                ostream.print(INDENT + INDENT);
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   307
            }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   308
        }
7810
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   309
    }
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   310
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   311
    private enum SizePrefix {
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   312
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   313
        KILO(1024, "K"),
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   314
        MEGA(1024 * 1024, "M"),
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   315
        GIGA(1024 * 1024 * 1024, "G"),
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   316
        TERA(1024L * 1024L * 1024L * 1024L, "T");
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   317
        long size;
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   318
        String abbrev;
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   319
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   320
        SizePrefix(long size, String abbrev) {
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   321
            this.size = size;
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   322
            this.abbrev = abbrev;
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   323
        }
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   324
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   325
        private static String scale(long v, SizePrefix prefix) {
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   326
            return BigDecimal.valueOf(v).divide(BigDecimal.valueOf(prefix.size),
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   327
                    2, RoundingMode.HALF_EVEN).toPlainString() + prefix.abbrev;
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   328
        }
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   329
        /*
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   330
         * scale the incoming values to a human readable form, represented as
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   331
         * K, M, G and T, see java.c parse_size for the scaled values and
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   332
         * suffixes. The lowest possible scaled value is Kilo.
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   333
         */
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   334
        static String scaleValue(long v) {
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   335
            if (v < MEGA.size) {
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   336
                return scale(v, KILO);
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   337
            } else if (v < GIGA.size) {
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   338
                return scale(v, MEGA);
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   339
            } else if (v < TERA.size) {
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   340
                return scale(v, GIGA);
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   341
            } else {
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   342
                return scale(v, TERA);
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   343
            }
d4730191e53c 7002386: (launcher) fix XshowSettings
ksrini
parents: 7297
diff changeset
   344
        }
7297
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   345
    }
906c58a8b849 6452854: Provide a flag to print the java configuration
ksrini
parents: 5982
diff changeset
   346
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   347
    /**
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   348
     * A private helper method to get a localized message and also
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   349
     * apply any arguments that we might pass.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   350
     */
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   351
    private static String getLocalizedMessage(String key, Object... args) {
8174
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   352
        String msg = ResourceBundleHolder.RB.getString(key);
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   353
        return (args != null) ? MessageFormat.format(msg, args) : msg;
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   354
    }
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   355
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   356
    /**
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   357
     * The java -help message is split into 3 parts, an invariant, followed
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   358
     * by a set of platform dependent variant messages, finally an invariant
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   359
     * set of lines.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   360
     * This method initializes the help message for the first time, and also
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   361
     * assembles the invariant header part of the message.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   362
     */
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   363
    static void initHelpMessage(String progname) {
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   364
        outBuf = outBuf.append(getLocalizedMessage("java.launcher.opt.header",
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   365
                (progname == null) ? "java" : progname ));
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   366
        outBuf = outBuf.append(getLocalizedMessage("java.launcher.opt.datamodel",
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   367
                32));
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   368
        outBuf = outBuf.append(getLocalizedMessage("java.launcher.opt.datamodel",
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   369
                64));
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   370
    }
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   371
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   372
    /**
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   373
     * Appends the vm selection messages to the header, already created.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   374
     * initHelpSystem must already be called.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   375
     */
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   376
    static void appendVmSelectMessage(String vm1, String vm2) {
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   377
        outBuf = outBuf.append(getLocalizedMessage("java.launcher.opt.vmselect",
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   378
                vm1, vm2));
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   379
    }
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   380
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   381
    /**
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   382
     * Appends the vm synoym message to the header, already created.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   383
     * initHelpSystem must be called before using this method.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   384
     */
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   385
    static void appendVmSynonymMessage(String vm1, String vm2) {
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   386
        outBuf = outBuf.append(getLocalizedMessage("java.launcher.opt.hotspot",
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   387
                vm1, vm2));
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   388
    }
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   389
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   390
    /**
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   391
     * Appends the last invariant part to the previously created messages,
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   392
     * and finishes up the printing to the desired output stream.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   393
     * initHelpSystem must be called before using this method.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   394
     */
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   395
    static void printHelpMessage(boolean printToStderr) {
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   396
        initOutput(printToStderr);
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   397
        outBuf = outBuf.append(getLocalizedMessage("java.launcher.opt.footer",
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   398
                File.pathSeparator));
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   399
        ostream.println(outBuf.toString());
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   400
    }
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   401
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   402
    /**
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   403
     * Prints the Xusage text to the desired output stream.
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   404
     */
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   405
    static void printXUsageMessage(boolean printToStderr) {
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   406
        initOutput(printToStderr);
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   407
        ostream.println(getLocalizedMessage("java.launcher.X.usage",
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   408
                File.pathSeparator));
12538
211d6e82fe51 7130404: [macosx] "os.arch" value should be "x86_64" for compatibility with Apple JDK6
jmelvin
parents: 12047
diff changeset
   409
        if (System.getProperty("os.name").contains("OS X")) {
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents: 11125
diff changeset
   410
            ostream.println(getLocalizedMessage("java.launcher.X.macosx.usage",
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents: 11125
diff changeset
   411
                        File.pathSeparator));
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents: 11125
diff changeset
   412
        }
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   413
    }
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   414
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   415
    static void initOutput(boolean printToStderr) {
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   416
        ostream =  (printToStderr) ? System.err : System.out;
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   417
    }
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   418
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   419
    static void initOutput(PrintStream ps) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   420
        ostream = ps;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   421
    }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   422
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   423
    static String getMainClassFromJar(String jarname) {
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   424
        String mainValue;
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   425
        try (JarFile jarFile = new JarFile(jarname)) {
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   426
            Manifest manifest = jarFile.getManifest();
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   427
            if (manifest == null) {
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   428
                abort(null, "java.launcher.jar.error2", jarname);
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   429
            }
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   430
            Attributes mainAttrs = manifest.getMainAttributes();
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   431
            if (mainAttrs == null) {
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   432
                abort(null, "java.launcher.jar.error3", jarname);
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   433
            }
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   434
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   435
            // Main-Class
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   436
            mainValue = mainAttrs.getValue(MAIN_CLASS);
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   437
            if (mainValue == null) {
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   438
                abort(null, "java.launcher.jar.error3", jarname);
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   439
            }
15682
793a36de151d 8003255: (profiles) Update JAR file specification to support profiles
alanb
parents: 15003
diff changeset
   440
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   441
            // Launcher-Agent-Class (only check for this when Main-Class present)
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   442
            String agentClass = mainAttrs.getValue(LAUNCHER_AGENT_CLASS);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   443
            if (agentClass != null) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   444
                ModuleLayer.boot().findModule("java.instrument").ifPresent(m -> {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   445
                    try {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   446
                        String cn = "sun.instrument.InstrumentationImpl";
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   447
                        Class<?> clazz = Class.forName(cn, false, null);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   448
                        Method loadAgent = clazz.getMethod("loadAgent", String.class);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   449
                        loadAgent.invoke(null, jarname);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   450
                    } catch (Throwable e) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   451
                        if (e instanceof InvocationTargetException) e = e.getCause();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   452
                        abort(e, "java.launcher.jar.error4", jarname);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   453
                    }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   454
                });
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   455
            }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   456
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
   457
            // Add-Exports and Add-Opens
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   458
            String exports = mainAttrs.getValue(ADD_EXPORTS);
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   459
            if (exports != null) {
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
   460
                addExportsOrOpens(exports, false);
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   461
            }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   462
            String opens = mainAttrs.getValue(ADD_OPENS);
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   463
            if (opens != null) {
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
   464
                addExportsOrOpens(opens, true);
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   465
            }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   466
15682
793a36de151d 8003255: (profiles) Update JAR file specification to support profiles
alanb
parents: 15003
diff changeset
   467
            /*
15687
9f473a0b9e86 8006667: Merge issue: Profile attribute need to be examined before custom attributes
dholmes
parents: 15682
diff changeset
   468
             * Hand off to FXHelper if it detects a JavaFX application
9f473a0b9e86 8006667: Merge issue: Profile attribute need to be examined before custom attributes
dholmes
parents: 15682
diff changeset
   469
             * This must be done after ensuring a Main-Class entry
9f473a0b9e86 8006667: Merge issue: Profile attribute need to be examined before custom attributes
dholmes
parents: 15682
diff changeset
   470
             * exists to enforce compliance with the jar specification
9f473a0b9e86 8006667: Merge issue: Profile attribute need to be examined before custom attributes
dholmes
parents: 15682
diff changeset
   471
             */
9f473a0b9e86 8006667: Merge issue: Profile attribute need to be examined before custom attributes
dholmes
parents: 15682
diff changeset
   472
            if (mainAttrs.containsKey(
24254
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   473
                    new Attributes.Name(JAVAFX_APPLICATION_MARKER))) {
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   474
                FXHelper.setFXLaunchParameters(jarname, LM_JAR);
15687
9f473a0b9e86 8006667: Merge issue: Profile attribute need to be examined before custom attributes
dholmes
parents: 15682
diff changeset
   475
                return FXHelper.class.getName();
9f473a0b9e86 8006667: Merge issue: Profile attribute need to be examined before custom attributes
dholmes
parents: 15682
diff changeset
   476
            }
9f473a0b9e86 8006667: Merge issue: Profile attribute need to be examined before custom attributes
dholmes
parents: 15682
diff changeset
   477
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   478
            return mainValue.trim();
8174
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   479
        } catch (IOException ioe) {
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   480
            abort(ioe, "java.launcher.jar.error1", jarname);
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   481
        }
8174
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   482
        return null;
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   483
    }
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   484
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   485
    /**
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   486
     * Process the Add-Exports or Add-Opens value. The value is
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   487
     * {@code <module>/<package> ( <module>/<package>)*}.
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   488
     */
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
   489
    static void addExportsOrOpens(String value, boolean open) {
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   490
        for (String moduleAndPackage : value.split(" ")) {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   491
            String[] s = moduleAndPackage.trim().split("/");
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   492
            if (s.length == 2) {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   493
                String mn = s[0];
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   494
                String pn = s[1];
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43809
diff changeset
   495
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
   496
                ModuleLayer.boot().findModule(mn).ifPresent(m -> {
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   497
                    if (m.getDescriptor().packages().contains(pn)) {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   498
                        if (open) {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   499
                            Modules.addOpensToAllUnnamed(m, pn);
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   500
                        } else {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   501
                            Modules.addExportsToAllUnnamed(m, pn);
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   502
                        }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   503
                    }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   504
                });
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   505
            }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   506
        }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   507
    }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
   508
7997
78536cac0841 6912013: Remove the temporary launcher fix to add modules in the bootclasspath
mchung
parents: 7810
diff changeset
   509
    // From src/share/bin/java.c:
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   510
    //   enum LaunchMode { LM_UNKNOWN = 0, LM_CLASS, LM_JAR, LM_MODULE }
7997
78536cac0841 6912013: Remove the temporary launcher fix to add modules in the bootclasspath
mchung
parents: 7810
diff changeset
   511
78536cac0841 6912013: Remove the temporary launcher fix to add modules in the bootclasspath
mchung
parents: 7810
diff changeset
   512
    private static final int LM_UNKNOWN = 0;
78536cac0841 6912013: Remove the temporary launcher fix to add modules in the bootclasspath
mchung
parents: 7810
diff changeset
   513
    private static final int LM_CLASS   = 1;
78536cac0841 6912013: Remove the temporary launcher fix to add modules in the bootclasspath
mchung
parents: 7810
diff changeset
   514
    private static final int LM_JAR     = 2;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   515
    private static final int LM_MODULE  = 3;
7997
78536cac0841 6912013: Remove the temporary launcher fix to add modules in the bootclasspath
mchung
parents: 7810
diff changeset
   516
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   517
    static void abort(Throwable t, String msgKey, Object... args) {
8174
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   518
        if (msgKey != null) {
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   519
            ostream.println(getLocalizedMessage(msgKey, args));
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   520
        }
13411
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   521
        if (trace) {
8174
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   522
            if (t != null) {
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   523
                t.printStackTrace();
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   524
            } else {
11125
99b115114fa3 7117357: Warnings in sun.instrument, tools and other sun.* classes
alanb
parents: 10126
diff changeset
   525
                Thread.dumpStack();
8174
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   526
            }
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   527
        }
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   528
        System.exit(1);
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   529
    }
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   530
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   531
    /**
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   532
     * This method:
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   533
     * 1. Loads the main class from the module or class path
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   534
     * 2. Checks the public static void main method.
42178
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   535
     * 3. If the main class extends FX Application then call on FXHelper to
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   536
     * perform the launch.
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   537
     *
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   538
     * @param printToStderr if set, all output will be routed to stderr
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   539
     * @param mode LaunchMode as determined by the arguments passed on the
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   540
     *             command line
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   541
     * @param what the module name[/class], JAR file, or the main class
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   542
     *             depending on the mode
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   543
     *
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   544
     * @return the application's main class
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   545
     */
7997
78536cac0841 6912013: Remove the temporary launcher fix to add modules in the bootclasspath
mchung
parents: 7810
diff changeset
   546
    public static Class<?> checkAndLoadMain(boolean printToStderr,
78536cac0841 6912013: Remove the temporary launcher fix to add modules in the bootclasspath
mchung
parents: 7810
diff changeset
   547
                                            int mode,
8174
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   548
                                            String what) {
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   549
        initOutput(printToStderr);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   550
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   551
        Class<?> mainClass = (mode == LM_MODULE) ? loadModuleMainClass(what)
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   552
                                                 : loadMainClass(mode, what);
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   553
42178
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   554
        // record the real main class for UI purposes
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   555
        // neither method above can return null, they will abort()
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   556
        appClass = mainClass;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   557
42178
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   558
        /*
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   559
         * Check if FXHelper can launch it using the FX launcher. In an FX app,
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   560
         * the main class may or may not have a main method, so do this before
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   561
         * validating the main class.
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   562
         */
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   563
        if (JAVAFX_FXHELPER_CLASS_NAME_SUFFIX.equals(mainClass.getName()) ||
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   564
            doesExtendFXApplication(mainClass)) {
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   565
            // Will abort() if there are problems with FX runtime
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   566
            FXHelper.setFXLaunchParameters(what, mode);
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   567
            mainClass = FXHelper.class;
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   568
        }
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   569
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   570
        validateMainClass(mainClass);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   571
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   572
        return mainClass;
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   573
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   574
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   575
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   576
     * Returns the main class for a module. The query is either a module name
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   577
     * or module-name/main-class. For the former then the module's main class
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   578
     * is obtained from the module descriptor (MainClass attribute).
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   579
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   580
    private static Class<?> loadModuleMainClass(String what) {
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   581
        int i = what.indexOf('/');
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   582
        String mainModule;
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   583
        String mainClass;
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   584
        if (i == -1) {
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   585
            mainModule = what;
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   586
            mainClass = null;
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   587
        } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   588
            mainModule = what.substring(0, i);
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   589
            mainClass = what.substring(i+1);
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   590
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   591
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   592
        // main module is in the boot layer
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
   593
        ModuleLayer layer = ModuleLayer.boot();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   594
        Optional<Module> om = layer.findModule(mainModule);
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   595
        if (!om.isPresent()) {
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   596
            // should not happen
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   597
            throw new InternalError("Module " + mainModule + " not in boot Layer");
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   598
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   599
        Module m = om.get();
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   600
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   601
        // get main class
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   602
        if (mainClass == null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   603
            Optional<String> omc = m.getDescriptor().mainClass();
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   604
            if (!omc.isPresent()) {
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   605
                abort(null, "java.launcher.module.error1", mainModule);
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   606
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   607
            mainClass = omc.get();
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   608
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   609
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   610
        // load the class from the module
43496
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   611
        Class<?> c = null;
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   612
        try {
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   613
            c = Class.forName(m, mainClass);
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   614
            if (c == null && System.getProperty("os.name", "").contains("OS X")
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   615
                    && Normalizer.isNormalized(mainClass, Normalizer.Form.NFD)) {
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   616
43496
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   617
                String cn = Normalizer.normalize(mainClass, Normalizer.Form.NFC);
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   618
                c = Class.forName(m, cn);
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   619
            }
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   620
        } catch (LinkageError le) {
43689
8ccdae71dba3 8173943: Change error reporting of LauncherHelper to include actual Error class name
rpatil
parents: 43496
diff changeset
   621
            abort(null, "java.launcher.module.error3", mainClass, m.getName(),
8ccdae71dba3 8173943: Change error reporting of LauncherHelper to include actual Error class name
rpatil
parents: 43496
diff changeset
   622
                    le.getClass().getName() + ": " + le.getLocalizedMessage());
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   623
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   624
        if (c == null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   625
            abort(null, "java.launcher.module.error2", mainClass, mainModule);
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   626
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   627
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   628
        System.setProperty("jdk.module.main.class", c.getName());
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   629
        return c;
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   630
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   631
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   632
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   633
     * Loads the main class from the class path (LM_CLASS or LM_JAR).
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   634
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   635
    private static Class<?> loadMainClass(int mode, String what) {
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   636
        // get the class name
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   637
        String cn;
7997
78536cac0841 6912013: Remove the temporary launcher fix to add modules in the bootclasspath
mchung
parents: 7810
diff changeset
   638
        switch (mode) {
8174
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   639
            case LM_CLASS:
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   640
                cn = what;
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   641
                break;
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   642
            case LM_JAR:
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   643
                cn = getMainClassFromJar(what);
8174
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   644
                break;
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   645
            default:
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   646
                // should never happen
89e3a22d4cd7 6968053: (launcher) hide exceptions under certain launcher failures
ksrini
parents: 7997
diff changeset
   647
                throw new InternalError("" + mode + ": Unknown launch mode");
7997
78536cac0841 6912013: Remove the temporary launcher fix to add modules in the bootclasspath
mchung
parents: 7810
diff changeset
   648
        }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   649
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   650
        // load the main class
7997
78536cac0841 6912013: Remove the temporary launcher fix to add modules in the bootclasspath
mchung
parents: 7810
diff changeset
   651
        cn = cn.replace('/', '.');
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   652
        Class<?> mainClass = null;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   653
        ClassLoader scl = ClassLoader.getSystemClassLoader();
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   654
        try {
43496
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   655
            try {
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   656
                mainClass = Class.forName(cn, false, scl);
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   657
            } catch (NoClassDefFoundError | ClassNotFoundException cnfe) {
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   658
                if (System.getProperty("os.name", "").contains("OS X")
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   659
                        && Normalizer.isNormalized(cn, Normalizer.Form.NFD)) {
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   660
                    try {
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   661
                        // On Mac OS X since all names with diacritical marks are
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   662
                        // given as decomposed it is possible that main class name
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   663
                        // comes incorrectly from the command line and we have
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   664
                        // to re-compose it
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   665
                        String ncn = Normalizer.normalize(cn, Normalizer.Form.NFC);
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   666
                        mainClass = Class.forName(ncn, false, scl);
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   667
                    } catch (NoClassDefFoundError | ClassNotFoundException cnfe1) {
43809
c3669a70a7ab 8174694: improve error message shown when main class can't be loaded
vromero
parents: 43713
diff changeset
   668
                        abort(cnfe1, "java.launcher.cls.error1", cn,
c3669a70a7ab 8174694: improve error message shown when main class can't be loaded
vromero
parents: 43713
diff changeset
   669
                                cnfe1.getClass().getCanonicalName(), cnfe1.getMessage());
43496
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   670
                    }
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   671
                } else {
43809
c3669a70a7ab 8174694: improve error message shown when main class can't be loaded
vromero
parents: 43713
diff changeset
   672
                    abort(cnfe, "java.launcher.cls.error1", cn,
c3669a70a7ab 8174694: improve error message shown when main class can't be loaded
vromero
parents: 43713
diff changeset
   673
                            cnfe.getClass().getCanonicalName(), cnfe.getMessage());
20179
fa41a3d5805e 8017248: Compiler Diacritics Issue
kizune
parents: 19409
diff changeset
   674
                }
fa41a3d5805e 8017248: Compiler Diacritics Issue
kizune
parents: 19409
diff changeset
   675
            }
43496
fbafb9f36e96 8167063: spurious message "A JNI error has occurred" if start-class cannot be initialized
rpatil
parents: 42339
diff changeset
   676
        } catch (LinkageError le) {
43689
8ccdae71dba3 8173943: Change error reporting of LauncherHelper to include actual Error class name
rpatil
parents: 43496
diff changeset
   677
            abort(le, "java.launcher.cls.error6", cn,
8ccdae71dba3 8173943: Change error reporting of LauncherHelper to include actual Error class name
rpatil
parents: 43496
diff changeset
   678
                    le.getClass().getName() + ": " + le.getLocalizedMessage());
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   679
        }
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   680
        return mainClass;
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   681
    }
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   682
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   683
    /*
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   684
     * Accessor method called by the launcher after getting the main class via
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   685
     * checkAndLoadMain(). The "application class" is the class that is finally
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   686
     * executed to start the application and in this case is used to report
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   687
     * the correct application name, typically for UI purposes.
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   688
     */
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   689
    public static Class<?> getApplicationClass() {
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   690
        return appClass;
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   691
    }
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   692
24254
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   693
    /*
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   694
     * Check if the given class is a JavaFX Application class. This is done
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   695
     * in a way that does not cause the Application class to load or throw
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   696
     * ClassNotFoundException if the JavaFX runtime is not available.
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   697
     */
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   698
    private static boolean doesExtendFXApplication(Class<?> mainClass) {
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   699
        for (Class<?> sc = mainClass.getSuperclass(); sc != null;
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   700
                sc = sc.getSuperclass()) {
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   701
            if (sc.getName().equals(JAVAFX_APPLICATION_CLASS_NAME)) {
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   702
                return true;
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   703
            }
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   704
        }
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   705
        return false;
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   706
    }
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   707
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   708
    // Check the existence and signature of main and abort if incorrect
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   709
    static void validateMainClass(Class<?> mainClass) {
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   710
        Method mainMethod;
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   711
        try {
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   712
            mainMethod = mainClass.getMethod("main", String[].class);
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   713
        } catch (NoSuchMethodException nsme) {
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   714
            // invalid main or not FX application, abort with an error
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   715
            abort(null, "java.launcher.cls.error4", mainClass.getName(),
24254
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   716
                  JAVAFX_APPLICATION_CLASS_NAME);
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   717
            return; // Avoid compiler issues
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   718
        }
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   719
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   720
        /*
1329
ce13b59a8401 4459600: java -jar fails to run Main-Class if classname followed by whitespace.
ksrini
parents: 1323
diff changeset
   721
         * getMethod (above) will choose the correct method, based
ce13b59a8401 4459600: java -jar fails to run Main-Class if classname followed by whitespace.
ksrini
parents: 1323
diff changeset
   722
         * on its name and parameter type, however, we still have to
ce13b59a8401 4459600: java -jar fails to run Main-Class if classname followed by whitespace.
ksrini
parents: 1323
diff changeset
   723
         * ensure that the method is static and returns a void.
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   724
         */
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   725
        int mod = mainMethod.getModifiers();
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   726
        if (!Modifier.isStatic(mod)) {
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   727
            abort(null, "java.launcher.cls.error2", "static",
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   728
                  mainMethod.getDeclaringClass().getName());
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   729
        }
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   730
        if (mainMethod.getReturnType() != java.lang.Void.TYPE) {
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   731
            abort(null, "java.launcher.cls.error3",
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   732
                  mainMethod.getDeclaringClass().getName());
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   733
        }
8806
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   734
    }
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   735
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   736
    private static final String encprop = "sun.jnu.encoding";
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   737
    private static String encoding = null;
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   738
    private static boolean isCharsetSupported = false;
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   739
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   740
    /*
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   741
     * converts a c or a byte array to a platform specific string,
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   742
     * previously implemented as a native method in the launcher.
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   743
     */
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   744
    static String makePlatformString(boolean printToStderr, byte[] inArray) {
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   745
        initOutput(printToStderr);
8806
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   746
        if (encoding == null) {
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   747
            encoding = System.getProperty(encprop);
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   748
            isCharsetSupported = Charset.isSupported(encoding);
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   749
        }
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   750
        try {
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   751
            String out = isCharsetSupported
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   752
                    ? new String(inArray, encoding)
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   753
                    : new String(inArray);
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   754
            return out;
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   755
        } catch (UnsupportedEncodingException uee) {
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   756
            abort(uee, null);
8806
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   757
        }
c81d4e10ffb7 7026184: (launcher) Regression: class with unicode name can't be launched by java.
ksrini
parents: 8174
diff changeset
   758
        return null; // keep the compiler happy
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
   759
    }
13411
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   760
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   761
    static String[] expandArgs(String[] argArray) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   762
        List<StdArg> aList = new ArrayList<>();
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   763
        for (String x : argArray) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   764
            aList.add(new StdArg(x));
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   765
        }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   766
        return expandArgs(aList);
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   767
    }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   768
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   769
    static String[] expandArgs(List<StdArg> argList) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   770
        ArrayList<String> out = new ArrayList<>();
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   771
        if (trace) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   772
            System.err.println("Incoming arguments:");
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   773
        }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   774
        for (StdArg a : argList) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   775
            if (trace) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   776
                System.err.println(a);
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   777
            }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   778
            if (a.needsExpansion) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   779
                File x = new File(a.arg);
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   780
                File parent = x.getParentFile();
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   781
                String glob = x.getName();
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   782
                if (parent == null) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   783
                    parent = new File(".");
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   784
                }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   785
                try (DirectoryStream<Path> dstream =
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   786
                        Files.newDirectoryStream(parent.toPath(), glob)) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   787
                    int entries = 0;
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   788
                    for (Path p : dstream) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   789
                        out.add(p.normalize().toString());
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   790
                        entries++;
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   791
                    }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   792
                    if (entries == 0) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   793
                        out.add(a.arg);
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   794
                    }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   795
                } catch (Exception e) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   796
                    out.add(a.arg);
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   797
                    if (trace) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   798
                        System.err.println("Warning: passing argument as-is " + a);
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   799
                        System.err.print(e);
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   800
                    }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   801
                }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   802
            } else {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   803
                out.add(a.arg);
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   804
            }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   805
        }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   806
        String[] oarray = new String[out.size()];
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   807
        out.toArray(oarray);
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   808
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   809
        if (trace) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   810
            System.err.println("Expanded arguments:");
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   811
            for (String x : oarray) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   812
                System.err.println(x);
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   813
            }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   814
        }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   815
        return oarray;
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   816
    }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   817
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   818
    /* duplicate of the native StdArg struct */
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   819
    private static class StdArg {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   820
        final String arg;
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   821
        final boolean needsExpansion;
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   822
        StdArg(String arg, boolean expand) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   823
            this.arg = arg;
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   824
            this.needsExpansion = expand;
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   825
        }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   826
        // protocol: first char indicates whether expansion is required
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   827
        // 'T' = true ; needs expansion
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   828
        // 'F' = false; needs no expansion
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   829
        StdArg(String in) {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   830
            this.arg = in.substring(1);
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   831
            needsExpansion = in.charAt(0) == 'T';
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   832
        }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   833
        public String toString() {
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   834
            return "StdArg{" + "arg=" + arg + ", needsExpansion=" + needsExpansion + '}';
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   835
        }
224a28370893 7146424: Wildcard expansion for single entry classpath
ksrini
parents: 12538
diff changeset
   836
    }
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   837
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   838
    static final class FXHelper {
24254
2da866863b98 8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily
ksrini
parents: 20179
diff changeset
   839
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   840
        private static final String JAVAFX_GRAPHICS_MODULE_NAME =
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   841
                "javafx.graphics";
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   842
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   843
        private static final String JAVAFX_LAUNCHER_CLASS_NAME =
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   844
                "com.sun.javafx.application.LauncherImpl";
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   845
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   846
        /*
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   847
         * The launch method used to invoke the JavaFX launcher. These must
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   848
         * match the strings used in the launchApplication method.
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   849
         *
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   850
         * Command line                 JavaFX-App-Class  Launch mode  FX Launch mode
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   851
         * java -cp fxapp.jar FXClass   N/A               LM_CLASS     "LM_CLASS"
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   852
         * java -cp somedir FXClass     N/A               LM_CLASS     "LM_CLASS"
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   853
         * java -jar fxapp.jar          Present           LM_JAR       "LM_JAR"
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   854
         * java -jar fxapp.jar          Not Present       LM_JAR       "LM_JAR"
42178
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   855
         * java -m module/class [1]     N/A               LM_MODULE    "LM_MODULE"
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   856
         * java -m module               N/A               LM_MODULE    "LM_MODULE"
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   857
         *
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   858
         * [1] - JavaFX-Application-Class is ignored when modular args are used, even
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   859
         * if present in a modular jar
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   860
         */
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   861
        private static final String JAVAFX_LAUNCH_MODE_CLASS = "LM_CLASS";
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   862
        private static final String JAVAFX_LAUNCH_MODE_JAR = "LM_JAR";
42178
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   863
        private static final String JAVAFX_LAUNCH_MODE_MODULE = "LM_MODULE";
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   864
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   865
        /*
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   866
         * FX application launcher and launch method, so we can launch
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   867
         * applications with no main method.
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   868
         */
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   869
        private static String fxLaunchName = null;
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   870
        private static String fxLaunchMode = null;
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   871
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   872
        private static Class<?> fxLauncherClass    = null;
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   873
        private static Method   fxLauncherMethod   = null;
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   874
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   875
        /*
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   876
         * Set the launch params according to what was passed to LauncherHelper
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   877
         * so we can use the same launch mode for FX. Abort if there is any
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   878
         * issue with loading the FX runtime or with the launcher method.
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   879
         */
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   880
        private static void setFXLaunchParameters(String what, int mode) {
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   881
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   882
            // find the module with the FX launcher
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
   883
            Optional<Module> om = ModuleLayer.boot().findModule(JAVAFX_GRAPHICS_MODULE_NAME);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   884
            if (!om.isPresent()) {
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   885
                abort(null, "java.launcher.cls.error5");
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   886
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   887
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   888
            // load the FX launcher class
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   889
            fxLauncherClass = Class.forName(om.get(), JAVAFX_LAUNCHER_CLASS_NAME);
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   890
            if (fxLauncherClass == null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   891
                abort(null, "java.launcher.cls.error5");
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   892
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   893
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   894
            try {
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   895
                /*
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   896
                 * signature must be:
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   897
                 * public static void launchApplication(String launchName,
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   898
                 *     String launchMode, String[] args);
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   899
                 */
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   900
                fxLauncherMethod = fxLauncherClass.getMethod("launchApplication",
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   901
                        String.class, String.class, String[].class);
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   902
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   903
                // verify launcher signature as we do when validating the main method
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   904
                int mod = fxLauncherMethod.getModifiers();
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   905
                if (!Modifier.isStatic(mod)) {
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   906
                    abort(null, "java.launcher.javafx.error1");
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   907
                }
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   908
                if (fxLauncherMethod.getReturnType() != java.lang.Void.TYPE) {
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   909
                    abort(null, "java.launcher.javafx.error1");
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   910
                }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   911
            } catch (NoSuchMethodException ex) {
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   912
                abort(ex, "java.launcher.cls.error5", ex);
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   913
            }
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   914
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   915
            fxLaunchName = what;
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   916
            switch (mode) {
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   917
                case LM_CLASS:
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   918
                    fxLaunchMode = JAVAFX_LAUNCH_MODE_CLASS;
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   919
                    break;
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   920
                case LM_JAR:
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   921
                    fxLaunchMode = JAVAFX_LAUNCH_MODE_JAR;
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   922
                    break;
42178
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   923
                case LM_MODULE:
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   924
                    fxLaunchMode = JAVAFX_LAUNCH_MODE_MODULE;
cb5cb430e207 8169289: JavaFX application in named module fails to launch if no main method
ddehaven
parents: 41966
diff changeset
   925
                    break;
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   926
                default:
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   927
                    // should not have gotten this far...
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   928
                    throw new InternalError(mode + ": Unknown launch mode");
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   929
            }
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   930
        }
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   931
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   932
        public static void main(String... args) throws Exception {
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   933
            if (fxLauncherMethod == null
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   934
                    || fxLaunchMode == null
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   935
                    || fxLaunchName == null) {
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   936
                throw new RuntimeException("Invalid JavaFX launch parameters");
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   937
            }
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   938
            // launch appClass via fxLauncherMethod
15003
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   939
            fxLauncherMethod.invoke(null,
364408faddeb 8004547: Extend JavaFX launcher support to allow full JavaFX launch feature set
ksrini
parents: 14518
diff changeset
   940
                    new Object[] {fxLaunchName, fxLaunchMode, args});
14518
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   941
        }
f4b1adde53b3 8001533: java launcher must launch javafx applications
ksrini
parents: 13411
diff changeset
   942
    }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   943
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   944
    /**
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   945
     * Called by the launcher to list the observable modules.
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   946
     */
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   947
    static void listModules() {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   948
        initOutput(System.out);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   949
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   950
        ModuleBootstrap.limitedFinder().findAll().stream()
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   951
            .sorted(new JrtFirstComparator())
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   952
            .forEach(LauncherHelper::showModule);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   953
    }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   954
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   955
    /**
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   956
     * Called by the launcher to show the resolved modules
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   957
     */
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   958
    static void showResolvedModules() {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   959
        initOutput(System.out);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   960
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   961
        ModuleLayer bootLayer = ModuleLayer.boot();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   962
        Configuration cf = bootLayer.configuration();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   963
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   964
        cf.modules().stream()
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   965
            .map(ResolvedModule::reference)
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   966
            .sorted(new JrtFirstComparator())
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   967
            .forEach(LauncherHelper::showModule);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   968
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   969
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   970
    /**
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   971
     * Called by the launcher to describe a module
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   972
     */
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   973
    static void describeModule(String moduleName) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   974
        initOutput(System.out);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   975
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   976
        ModuleFinder finder = ModuleBootstrap.limitedFinder();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   977
        ModuleReference mref = finder.find(moduleName).orElse(null);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   978
        if (mref == null) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   979
            abort(null, "java.launcher.module.error4", moduleName);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   980
        }
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   981
        ModuleDescriptor md = mref.descriptor();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
   982
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   983
        // one-line summary
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   984
        showModule(mref);
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
   985
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
   986
        // unqualified exports (sorted by package)
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   987
        md.exports().stream()
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   988
            .filter(e -> !e.isQualified())
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   989
            .sorted(Comparator.comparing(Exports::source))
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   990
            .map(e -> Stream.concat(Stream.of(e.source()),
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   991
                                    toStringStream(e.modifiers()))
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   992
                    .collect(Collectors.joining(" ")))
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   993
            .forEach(sourceAndMods -> ostream.format("exports %s%n", sourceAndMods));
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   994
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   995
        // dependences
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   996
        for (Requires r : md.requires()) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   997
            String nameAndMods = Stream.concat(Stream.of(r.name()),
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
   998
                                               toStringStream(r.modifiers()))
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
   999
                    .collect(Collectors.joining(" "));
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1000
            ostream.format("requires %s", nameAndMods);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1001
            finder.find(r.name())
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1002
                .map(ModuleReference::descriptor)
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1003
                .filter(ModuleDescriptor::isAutomatic)
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1004
                .ifPresent(any -> ostream.print(" automatic"));
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1005
            ostream.println();
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1006
        }
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1007
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1008
        // service use and provides
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1009
        for (String s : md.uses()) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1010
            ostream.format("uses %s%n", s);
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1011
        }
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1012
        for (Provides ps : md.provides()) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1013
            String names = ps.providers().stream().collect(Collectors.joining(" "));
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1014
            ostream.format("provides %s with %s%n", ps.service(), names);
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1015
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1016
        }
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1017
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1018
        // qualified exports
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1019
        for (Exports e : md.exports()) {
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1020
            if (e.isQualified()) {
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1021
                String who = e.targets().stream().collect(Collectors.joining(" "));
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1022
                ostream.format("qualified exports %s to %s%n", e.source(), who);
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1023
            }
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1024
        }
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1025
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1026
        // open packages
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1027
        for (Opens opens: md.opens()) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1028
            if (opens.isQualified())
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1029
                ostream.print("qualified ");
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1030
            String sourceAndMods = Stream.concat(Stream.of(opens.source()),
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1031
                                                 toStringStream(opens.modifiers()))
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1032
                    .collect(Collectors.joining(" "));
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1033
            ostream.format("opens %s", sourceAndMods);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1034
            if (opens.isQualified()) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1035
                String who = opens.targets().stream().collect(Collectors.joining(" "));
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1036
                ostream.format(" to %s", who);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1037
            }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1038
            ostream.println();
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1039
        }
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1040
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1041
        // non-exported/non-open packages
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1042
        Set<String> concealed = new TreeSet<>(md.packages());
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1043
        md.exports().stream().map(Exports::source).forEach(concealed::remove);
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1044
        md.opens().stream().map(Opens::source).forEach(concealed::remove);
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1045
        concealed.forEach(p -> ostream.format("contains %s%n", p));
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1046
    }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1047
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1048
    /**
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1049
     * Prints a single line with the module name, version and modifiers
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1050
     */
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1051
    private static void showModule(ModuleReference mref) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1052
        ModuleDescriptor md = mref.descriptor();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1053
        ostream.print(md.toNameAndVersion());
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1054
        mref.location()
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1055
                .filter(uri -> !isJrt(uri))
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1056
                .ifPresent(uri -> ostream.format(" %s", uri));
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1057
        if (md.isOpen())
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1058
            ostream.print(" open");
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1059
        if (md.isAutomatic())
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1060
            ostream.print(" automatic");
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1061
        ostream.println();
44545
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1062
    }
83b611b88ac8 8177530: Module system implementation refresh (4/2017)
alanb
parents: 44364
diff changeset
  1063
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1064
    /**
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1065
     * A ModuleReference comparator that considers modules in the run-time
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1066
     * image to be less than modules than not in the run-time image.
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1067
     */
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1068
    private static class JrtFirstComparator implements Comparator<ModuleReference> {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1069
        private final Comparator<ModuleReference> real;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1070
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1071
        JrtFirstComparator() {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1072
            this.real = Comparator.comparing(ModuleReference::descriptor);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1073
        }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1074
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1075
        @Override
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1076
        public int compare(ModuleReference a, ModuleReference b) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1077
            if (isJrt(a)) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1078
                return isJrt(b) ? real.compare(a, b) : -1;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1079
            } else {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1080
                return isJrt(b) ? 1 : real.compare(a, b);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1081
            }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1082
        }
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
  1083
    }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
  1084
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1085
    private static <T> Stream<String> toStringStream(Set<T> s) {
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
  1086
        return s.stream().map(e -> e.toString().toLowerCase());
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
  1087
    }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41966
diff changeset
  1088
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1089
    private static boolean isJrt(ModuleReference mref) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1090
        return isJrt(mref.location().orElse(null));
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1091
    }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1092
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1093
    private static boolean isJrt(URI uri) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1094
        return (uri != null && uri.getScheme().equalsIgnoreCase("jrt"));
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1095
    }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1096
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1097
    /**
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1098
     * Called by the launcher to validate the modules on the upgrade and
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1099
     * application module paths.
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1100
     *
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1101
     * @return {@code true} if no errors are found
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1102
     */
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1103
    private static boolean validateModules() {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1104
        initOutput(System.out);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1105
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1106
        ModuleValidator validator = new ModuleValidator();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1107
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1108
        // upgrade module path
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1109
        String value = System.getProperty("jdk.module.upgrade.path");
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1110
        if (value != null) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1111
            Stream.of(value.split(File.pathSeparator))
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1112
                    .map(Paths::get)
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1113
                    .forEach(validator::scan);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1114
        }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1115
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1116
        // system modules
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1117
        ModuleFinder.ofSystem().findAll().stream()
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1118
                .sorted(Comparator.comparing(ModuleReference::descriptor))
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1119
                .forEach(validator::process);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1120
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1121
        // application module path
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1122
        value = System.getProperty("jdk.module.path");
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1123
        if (value != null) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1124
            Stream.of(value.split(File.pathSeparator))
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1125
                    .map(Paths::get)
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1126
                    .forEach(validator::scan);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1127
        }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1128
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1129
        return !validator.foundErrors();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1130
    }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1131
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1132
    /**
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1133
     * A simple validator to check for errors and conflicts between modules.
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1134
     */
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1135
    static class ModuleValidator {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1136
        private static final String MODULE_INFO = "module-info.class";
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1137
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1138
        private Map<String, ModuleReference> nameToModule = new HashMap<>();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1139
        private Map<String, ModuleReference> packageToModule = new HashMap<>();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1140
        private boolean errorFound;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1141
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1142
        /**
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1143
         * Returns true if at least one error was found
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1144
         */
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1145
        boolean foundErrors() {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1146
            return errorFound;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1147
        }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1148
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1149
        /**
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1150
         * Prints the module location and name.
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1151
         */
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1152
        private void printModule(ModuleReference mref) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1153
            mref.location()
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1154
                .filter(uri -> !isJrt(uri))
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1155
                .ifPresent(uri -> ostream.print(uri + " "));
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1156
            ModuleDescriptor descriptor = mref.descriptor();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1157
            ostream.print(descriptor.name());
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1158
            if (descriptor.isAutomatic())
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1159
                ostream.print(" automatic");
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1160
            ostream.println();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1161
        }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1162
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1163
        /**
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1164
         * Prints the module location and name, checks if the module is
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1165
         * shadowed by a previously seen module, and finally checks for
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1166
         * package conflicts with previously seen modules.
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1167
         */
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1168
        void process(ModuleReference mref) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1169
            printModule(mref);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1170
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1171
            String name = mref.descriptor().name();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1172
            ModuleReference previous = nameToModule.putIfAbsent(name, mref);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1173
            if (previous != null) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1174
                ostream.print(INDENT + "shadowed by ");
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1175
                printModule(previous);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1176
            } else {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1177
                // check for package conflicts when not shadowed
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1178
                for (String pkg :  mref.descriptor().packages()) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1179
                    previous = packageToModule.putIfAbsent(pkg, mref);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1180
                    if (previous != null) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1181
                        String mn = previous.descriptor().name();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1182
                        ostream.println(INDENT + "contains " + pkg
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1183
                                        + " conflicts with module " + mn);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1184
                        errorFound = true;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1185
                    }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1186
                }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1187
            }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1188
        }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1189
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1190
        /**
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1191
         * Scan an element on a module path. The element is a directory
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1192
         * of modules, an exploded module, or a JAR file.
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1193
         */
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1194
        void scan(Path entry) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1195
            BasicFileAttributes attrs;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1196
            try {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1197
                attrs = Files.readAttributes(entry, BasicFileAttributes.class);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1198
            } catch (NoSuchFileException ignore) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1199
                return;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1200
            } catch (IOException ioe) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1201
                ostream.println(entry + " " + ioe);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1202
                errorFound = true;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1203
                return;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1204
            }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1205
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1206
            String fn = entry.getFileName().toString();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1207
            if (attrs.isRegularFile() && fn.endsWith(".jar")) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1208
                // JAR file, explicit or automatic module
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1209
                scanModule(entry).ifPresent(this::process);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1210
            } else if (attrs.isDirectory()) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1211
                Path mi = entry.resolve(MODULE_INFO);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1212
                if (Files.exists(mi)) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1213
                    // exploded module
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1214
                    scanModule(entry).ifPresent(this::process);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1215
                } else {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1216
                    // directory of modules
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1217
                    scanDirectory(entry);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1218
                }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1219
            }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1220
        }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1221
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1222
        /**
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1223
         * Scan the JAR files and exploded modules in a directory.
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1224
         */
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1225
        private void scanDirectory(Path dir) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1226
            try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1227
                Map<String, Path> moduleToEntry = new HashMap<>();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1228
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1229
                for (Path entry : stream) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1230
                    BasicFileAttributes attrs;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1231
                    try {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1232
                        attrs = Files.readAttributes(entry, BasicFileAttributes.class);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1233
                    } catch (IOException ioe) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1234
                        ostream.println(entry + " " + ioe);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1235
                        errorFound = true;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1236
                        continue;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1237
                    }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1238
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1239
                    ModuleReference mref = null;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1240
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1241
                    String fn = entry.getFileName().toString();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1242
                    if (attrs.isRegularFile() && fn.endsWith(".jar")) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1243
                        mref = scanModule(entry).orElse(null);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1244
                    } else if (attrs.isDirectory()) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1245
                        Path mi = entry.resolve(MODULE_INFO);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1246
                        if (Files.exists(mi)) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1247
                            mref = scanModule(entry).orElse(null);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1248
                        }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1249
                    }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1250
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1251
                    if (mref != null) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1252
                        String name = mref.descriptor().name();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1253
                        Path previous = moduleToEntry.putIfAbsent(name, entry);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1254
                        if (previous != null) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1255
                            // same name as other module in the directory
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1256
                            printModule(mref);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1257
                            ostream.println(INDENT + "contains same module as "
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1258
                                            + previous.getFileName());
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1259
                            errorFound = true;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1260
                        } else {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1261
                            process(mref);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1262
                        }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1263
                    }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1264
                }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1265
            } catch (IOException ioe) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1266
                ostream.println(dir + " " + ioe);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1267
                errorFound = true;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1268
            }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1269
        }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1270
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1271
        /**
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1272
         * Scan a JAR file or exploded module.
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1273
         */
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1274
        private Optional<ModuleReference> scanModule(Path entry) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1275
            ModuleFinder finder = ModuleFinder.of(entry);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1276
            try {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1277
                return finder.findAll().stream().findFirst();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1278
            } catch (FindException e) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1279
                ostream.println(entry);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1280
                ostream.println(INDENT + e.getMessage());
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1281
                Throwable cause = e.getCause();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1282
                if (cause != null) {
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1283
                    ostream.println(INDENT + cause);
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1284
                }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1285
                errorFound = true;
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1286
                return Optional.empty();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1287
            }
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44545
diff changeset
  1288
        }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 34882
diff changeset
  1289
    }
1323
e14a3b3536cd 6742159: (launcher) improve the java launching mechanism
ksrini
parents:
diff changeset
  1290
}