src/java.base/share/classes/jdk/internal/module/IllegalAccessLogger.java
author mchung
Tue, 06 Nov 2018 10:01:16 -0800
changeset 52427 3c6aa484536c
parent 47216 71c04702a3d5
permissions -rw-r--r--
8211122: Reduce the number of internal classes made accessible to jdk.unsupported Reviewed-by: alanb, dfuchs, kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
     1
/*
52427
3c6aa484536c 8211122: Reduce the number of internal classes made accessible to jdk.unsupported
mchung
parents: 47216
diff changeset
     2
 * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
     4
 *
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    10
 *
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    15
 * accompanied this code).
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    16
 *
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    20
 *
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    23
 * questions.
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    24
 */
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    25
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    26
package jdk.internal.module;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    27
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
    28
import java.io.PrintStream;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    29
import java.lang.invoke.MethodHandles;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    30
import java.net.URL;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    31
import java.security.AccessController;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    32
import java.security.CodeSource;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    33
import java.security.PrivilegedAction;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    34
import java.security.ProtectionDomain;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    35
import java.util.HashMap;
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    36
import java.util.LinkedHashMap;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    37
import java.util.List;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    38
import java.util.Map;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    39
import java.util.Objects;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    40
import java.util.Set;
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    41
import java.util.StringJoiner;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    42
import java.util.WeakHashMap;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    43
import java.util.function.Supplier;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    44
import java.util.stream.Collectors;
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    45
import static java.util.Collections.*;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    46
52427
3c6aa484536c 8211122: Reduce the number of internal classes made accessible to jdk.unsupported
mchung
parents: 47216
diff changeset
    47
import jdk.internal.access.JavaLangAccess;
3c6aa484536c 8211122: Reduce the number of internal classes made accessible to jdk.unsupported
mchung
parents: 47216
diff changeset
    48
import jdk.internal.access.SharedSecrets;
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
    49
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    50
/**
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    51
 * Supports logging of access to members of exported and concealed packages
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    52
 * that are opened to code in unnamed modules for illegal access.
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    53
 */
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    54
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    55
public final class IllegalAccessLogger {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
    56
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
    57
    /**
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    58
     * Logger modes
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
    59
     */
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    60
    public static enum Mode {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    61
        /**
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    62
         * Prints a warning when an illegal access succeeds and then
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    63
         * discards the logger so that there is no further output.
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    64
         */
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    65
        ONESHOT,
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    66
        /**
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    67
         * Print warnings when illegal access succeeds
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    68
         */
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    69
        WARN,
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    70
        /**
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    71
         * Prints warnings and a stack trace when illegal access succeeds
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    72
         */
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    73
        DEBUG,
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    74
    }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    75
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    76
    /**
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    77
     * A builder for IllegalAccessLogger objects.
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    78
     */
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    79
    public static class Builder {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    80
        private final Mode mode;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    81
        private final PrintStream warningStream;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    82
        private final Map<Module, Set<String>> moduleToConcealedPackages;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    83
        private final Map<Module, Set<String>> moduleToExportedPackages;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    84
        private boolean complete;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    85
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    86
        private void ensureNotComplete() {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    87
            if (complete) throw new IllegalStateException();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    88
        }
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
    89
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    90
        /**
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    91
         * Creates a builder.
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    92
         */
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    93
        public Builder(Mode mode, PrintStream warningStream) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    94
            this.mode = mode;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    95
            this.warningStream = warningStream;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    96
            this.moduleToConcealedPackages = new HashMap<>();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    97
            this.moduleToExportedPackages = new HashMap<>();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
    98
        }
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
    99
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   100
        /**
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   101
         * Adding logging of reflective-access to any member of a type in
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   102
         * otherwise concealed packages.
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   103
         */
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   104
        public Builder logAccessToConcealedPackages(Module m, Set<String> packages) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   105
            ensureNotComplete();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   106
            moduleToConcealedPackages.put(m, unmodifiableSet(packages));
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   107
            return this;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   108
        }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   109
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   110
        /**
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   111
         * Adding logging of reflective-access to non-public members/types in
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   112
         * otherwise exported (not open) packages.
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   113
         */
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   114
        public Builder logAccessToExportedPackages(Module m, Set<String> packages) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   115
            ensureNotComplete();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   116
            moduleToExportedPackages.put(m, unmodifiableSet(packages));
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   117
            return this;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   118
        }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   119
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   120
        /**
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   121
         * Builds the IllegalAccessLogger and sets it as the system-wise logger.
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   122
         */
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   123
        public void complete() {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   124
            Map<Module, Set<String>> map1 = unmodifiableMap(moduleToConcealedPackages);
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   125
            Map<Module, Set<String>> map2 = unmodifiableMap(moduleToExportedPackages);
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   126
            logger = new IllegalAccessLogger(mode, warningStream, map1, map2);
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   127
            complete = true;
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
   128
        }
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   129
    }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   130
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   131
    // need access to java.lang.Module
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   132
    private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   133
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   134
    // system-wide IllegalAccessLogger
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   135
    private static volatile IllegalAccessLogger logger;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   136
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   137
    // logger mode
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   138
    private final Mode mode;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   139
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
   140
    // the print stream to send the warnings
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
   141
    private final PrintStream warningStream;
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
   142
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   143
    // module -> packages open for illegal access
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   144
    private final Map<Module, Set<String>> moduleToConcealedPackages;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   145
    private final Map<Module, Set<String>> moduleToExportedPackages;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   146
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   147
    // caller -> usages
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   148
    private final Map<Class<?>, Usages> callerToUsages = new WeakHashMap<>();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   149
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   150
    private IllegalAccessLogger(Mode mode,
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   151
                                PrintStream warningStream,
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   152
                                Map<Module, Set<String>> moduleToConcealedPackages,
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   153
                                Map<Module, Set<String>> moduleToExportedPackages)
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   154
    {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   155
        this.mode = mode;
44364
9cc9dc782213 8177474: Do not emit warnings when illegal access is allowed by --add-exports/--add-opens
alanb
parents: 44359
diff changeset
   156
        this.warningStream = warningStream;
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   157
        this.moduleToConcealedPackages = moduleToConcealedPackages;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   158
        this.moduleToExportedPackages = moduleToExportedPackages;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   159
    }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   160
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   161
    /**
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   162
     * Returns the system-wide IllegalAccessLogger or {@code null} if there is
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   163
     * no logger.
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   164
     */
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   165
    public static IllegalAccessLogger illegalAccessLogger() {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   166
        return logger;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   167
    }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   168
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   169
    /**
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   170
     * Returns true if the module exports a concealed package for illegal
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   171
     * access.
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   172
     */
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   173
    public boolean isExportedForIllegalAccess(Module module, String pn) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   174
        Set<String> packages = moduleToConcealedPackages.get(module);
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   175
        if (packages != null && packages.contains(pn))
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   176
            return true;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   177
        return false;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   178
    }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   179
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   180
    /**
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   181
     * Returns true if the module opens a concealed or exported package for
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   182
     * illegal access.
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   183
     */
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   184
    public boolean isOpenForIllegalAccess(Module module, String pn) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   185
        if (isExportedForIllegalAccess(module, pn))
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   186
            return true;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   187
        Set<String> packages = moduleToExportedPackages.get(module);
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   188
        if (packages != null && packages.contains(pn))
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   189
            return true;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   190
        return false;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   191
    }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   192
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   193
    /**
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   194
     * Logs access to the member of a target class by a caller class if the class
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   195
     * is in a package that is exported for illegal access.
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   196
     *
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   197
     * The {@code whatSupplier} supplies the message that describes the member.
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   198
     */
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   199
    public void logIfExportedForIllegalAccess(Class<?> caller,
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   200
                                              Class<?> target,
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   201
                                              Supplier<String> whatSupplier) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   202
        Module targetModule = target.getModule();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   203
        String targetPackage = target.getPackageName();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   204
        if (isExportedForIllegalAccess(targetModule, targetPackage)) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   205
            Module callerModule = caller.getModule();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   206
            if (!JLA.isReflectivelyExported(targetModule, targetPackage, callerModule)) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   207
                log(caller, whatSupplier.get());
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   208
            }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   209
        }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   210
    }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   211
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   212
    /**
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   213
     * Logs access to the member of a target class by a caller class if the class
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   214
     * is in a package that is opened for illegal access.
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   215
     *
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   216
     * The {@code what} parameter supplies the message that describes the member.
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   217
     */
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   218
    public void logIfOpenedForIllegalAccess(Class<?> caller,
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   219
                                            Class<?> target,
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   220
                                            Supplier<String> whatSupplier) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   221
        Module targetModule = target.getModule();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   222
        String targetPackage = target.getPackageName();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   223
        if (isOpenForIllegalAccess(targetModule, targetPackage)) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   224
            Module callerModule = caller.getModule();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   225
            if (!JLA.isReflectivelyOpened(targetModule, targetPackage, callerModule)) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   226
                log(caller, whatSupplier.get());
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   227
            }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   228
        }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   229
    }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   230
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   231
    /**
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   232
     * Logs access by caller lookup if the target class is in a package that is
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   233
     * opened for illegal access.
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   234
     */
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   235
    public void logIfOpenedForIllegalAccess(MethodHandles.Lookup caller, Class<?> target) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   236
        Module targetModule = target.getModule();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   237
        String targetPackage = target.getPackageName();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   238
        if (isOpenForIllegalAccess(targetModule, targetPackage)) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   239
            Class<?> callerClass = caller.lookupClass();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   240
            Module callerModule = callerClass.getModule();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   241
            if (!JLA.isReflectivelyOpened(targetModule, targetPackage, callerModule)) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   242
                URL url = codeSource(callerClass);
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   243
                final String source;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   244
                if (url == null) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   245
                    source = callerClass.getName();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   246
                } else {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   247
                    source = callerClass.getName() + " (" + url + ")";
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   248
                }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   249
                log(callerClass, target.getName(), () ->
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   250
                    "WARNING: Illegal reflective access using Lookup on " + source
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   251
                    + " to " + target);
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   252
            }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   253
        }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   254
    }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   255
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   256
    /**
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   257
     * Logs access by a caller class. The {@code what} parameter describes
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   258
     * the member being accessed.
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   259
     */
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   260
    private void log(Class<?> caller, String what) {
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   261
        log(caller, what, () -> {
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   262
            URL url = codeSource(caller);
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   263
            String source = caller.getName();
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   264
            if (url != null)
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   265
                source += " (" + url + ")";
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   266
            return "WARNING: Illegal reflective access by " + source + " to " + what;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   267
        });
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   268
    }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   269
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   270
    /**
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   271
     * Log access by a caller. The {@code what} parameter describes the class or
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   272
     * member that is being accessed. The {@code msgSupplier} supplies the log
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   273
     * message.
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   274
     *
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   275
     * To reduce output, this method only logs the access if it hasn't been seen
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   276
     * previously. "Seen previously" is implemented as a map of caller class -> Usage,
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   277
     * where a Usage is the "what" and a hash of the stack trace. The map has weak
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   278
     * keys so it can be expunged when the caller is GC'ed/unloaded.
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   279
     */
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   280
    private void log(Class<?> caller, String what, Supplier<String> msgSupplier) {
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   281
        if (mode == Mode.ONESHOT) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   282
            synchronized (IllegalAccessLogger.class) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   283
                // discard the system wide logger
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   284
                if (logger == null)
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   285
                    return;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   286
                logger = null;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   287
            }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   288
            warningStream.println(loudWarning(caller, msgSupplier));
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   289
            return;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   290
        }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   291
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   292
        // stack trace without the top-most frames in java.base
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   293
        List<StackWalker.StackFrame> stack = StackWalkerHolder.INSTANCE.walk(s ->
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   294
            s.dropWhile(this::isJavaBase)
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   295
             .limit(32)
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   296
             .collect(Collectors.toList())
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   297
        );
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   298
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   299
        // record usage if this is the first (or not recently recorded)
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   300
        Usage u = new Usage(what, hash(stack));
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   301
        boolean added;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   302
        synchronized (this) {
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   303
            added = callerToUsages.computeIfAbsent(caller, k -> new Usages()).add(u);
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   304
        }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   305
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   306
        // print warning if this is the first (or not a recent) usage
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   307
        if (added) {
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   308
            String msg = msgSupplier.get();
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   309
            if (mode == Mode.DEBUG) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   310
                StringBuilder sb = new StringBuilder(msg);
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   311
                stack.forEach(f ->
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   312
                    sb.append(System.lineSeparator()).append("\tat " + f)
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   313
                );
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   314
                msg = sb.toString();
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   315
            }
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   316
            warningStream.println(msg);
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   317
        }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   318
    }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   319
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   320
    /**
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   321
     * Returns the code source for the given class or null if there is no code source
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   322
     */
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   323
    private URL codeSource(Class<?> clazz) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   324
        PrivilegedAction<ProtectionDomain> pa = clazz::getProtectionDomain;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   325
        CodeSource cs = AccessController.doPrivileged(pa).getCodeSource();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   326
        return (cs != null) ? cs.getLocation() : null;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   327
    }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   328
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   329
    private String loudWarning(Class<?> caller,  Supplier<String> msgSupplier) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   330
        StringJoiner sj = new StringJoiner(System.lineSeparator());
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   331
        sj.add("WARNING: An illegal reflective access operation has occurred");
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   332
        sj.add(msgSupplier.get());
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   333
        sj.add("WARNING: Please consider reporting this to the maintainers of "
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   334
                + caller.getName());
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   335
        sj.add("WARNING: Use --illegal-access=warn to enable warnings of further"
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   336
                + " illegal reflective access operations");
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   337
        sj.add("WARNING: All illegal access operations will be denied in a"
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   338
                + " future release");
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   339
        return sj.toString();
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   340
    }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   341
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   342
    private static class StackWalkerHolder {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   343
        static final StackWalker INSTANCE;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   344
        static {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   345
            PrivilegedAction<StackWalker> pa = () ->
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   346
                StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE);
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   347
            INSTANCE = AccessController.doPrivileged(pa);
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   348
        }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   349
    }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   350
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   351
    /**
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   352
     * Returns true if the stack frame is for a class in java.base.
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   353
     */
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   354
    private boolean isJavaBase(StackWalker.StackFrame frame) {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   355
        Module caller = frame.getDeclaringClass().getModule();
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   356
        return "java.base".equals(caller.getName());
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   357
    }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   358
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   359
    /**
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   360
     * Computes a hash code for the give stack frames. The hash code is based
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   361
     * on the class, method name, and BCI.
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   362
     */
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   363
    private int hash(List<StackWalker.StackFrame> stack) {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   364
        int hash = 0;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   365
        for (StackWalker.StackFrame frame : stack) {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   366
            hash = (31 * hash) + Objects.hash(frame.getDeclaringClass(),
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   367
                                              frame.getMethodName(),
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   368
                                              frame.getByteCodeIndex());
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   369
        }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   370
        return hash;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   371
    }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   372
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   373
    private static class Usage {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   374
        private final String what;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   375
        private final int stack;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   376
        Usage(String what, int stack) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   377
            this.what = what;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   378
            this.stack = stack;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   379
        }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   380
        @Override
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   381
        public int hashCode() {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   382
            return what.hashCode() ^ stack;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   383
        }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   384
        @Override
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   385
        public boolean equals(Object ob) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   386
            if (ob instanceof Usage) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   387
                Usage that = (Usage)ob;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   388
                return what.equals(that.what) && stack == (that.stack);
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   389
            } else {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   390
                return false;
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   391
            }
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   392
        }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   393
    }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   394
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   395
    @SuppressWarnings("serial")
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   396
    private static class Usages extends LinkedHashMap<Usage, Boolean> {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   397
        Usages() { }
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   398
        boolean add(Usage u) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   399
            return (putIfAbsent(u, Boolean.TRUE) == null);
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   400
        }
45652
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   401
        @Override
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   402
        protected boolean removeEldestEntry(Map.Entry<Usage, Boolean> oldest) {
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   403
            // prevent map growing too big, say where a utility class
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   404
            // is used by generated code to do illegal access
33342314ce89 8181087: Module system implementation refresh (6/2017)
alanb
parents: 44545
diff changeset
   405
            return size() > 16;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   406
        }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   407
    }
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents:
diff changeset
   408
}