< prev index next >

src/java.base/share/classes/jdk/internal/module/IllegalAccessLogger.java

Print this page
   1 /*
   2  * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any


  40 import java.util.Set;
  41 import java.util.StringJoiner;
  42 import java.util.WeakHashMap;
  43 import java.util.function.Supplier;
  44 import java.util.stream.Collectors;
  45 import static java.util.Collections.*;
  46 
  47 import jdk.internal.access.JavaLangAccess;
  48 import jdk.internal.access.SharedSecrets;
  49 
  50 /**
  51  * Supports logging of access to members of exported and concealed packages
  52  * that are opened to code in unnamed modules for illegal access.
  53  */
  54 
  55 public final class IllegalAccessLogger {
  56 
  57     /**
  58      * Logger modes
  59      */
  60     public static enum Mode {
  61         /**
  62          * Prints a warning when an illegal access succeeds and then
  63          * discards the logger so that there is no further output.
  64          */
  65         ONESHOT,
  66         /**
  67          * Print warnings when illegal access succeeds
  68          */
  69         WARN,
  70         /**
  71          * Prints warnings and a stack trace when illegal access succeeds
  72          */
  73         DEBUG,
  74     }
  75 
  76     /**
  77      * A builder for IllegalAccessLogger objects.
  78      */
  79     public static class Builder {
  80         private final Mode mode;


 101          * Adding logging of reflective-access to any member of a type in
 102          * otherwise concealed packages.
 103          */
 104         public Builder logAccessToConcealedPackages(Module m, Set<String> packages) {
 105             ensureNotComplete();
 106             moduleToConcealedPackages.put(m, unmodifiableSet(packages));
 107             return this;
 108         }
 109 
 110         /**
 111          * Adding logging of reflective-access to non-public members/types in
 112          * otherwise exported (not open) packages.
 113          */
 114         public Builder logAccessToExportedPackages(Module m, Set<String> packages) {
 115             ensureNotComplete();
 116             moduleToExportedPackages.put(m, unmodifiableSet(packages));
 117             return this;
 118         }
 119 
 120         /**
 121          * Builds the IllegalAccessLogger and sets it as the system-wise logger.
 122          */
 123         public void complete() {
 124             Map<Module, Set<String>> map1 = unmodifiableMap(moduleToConcealedPackages);
 125             Map<Module, Set<String>> map2 = unmodifiableMap(moduleToExportedPackages);
 126             logger = new IllegalAccessLogger(mode, warningStream, map1, map2);
 127             complete = true;
 128         }
 129     }
 130 
 131     // need access to java.lang.Module
 132     private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
 133 
 134     // system-wide IllegalAccessLogger
 135     private static volatile IllegalAccessLogger logger;
 136 
 137     // logger mode
 138     private final Mode mode;
 139 
 140     // the print stream to send the warnings
 141     private final PrintStream warningStream;


   1 /*
   2  * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any


  40 import java.util.Set;
  41 import java.util.StringJoiner;
  42 import java.util.WeakHashMap;
  43 import java.util.function.Supplier;
  44 import java.util.stream.Collectors;
  45 import static java.util.Collections.*;
  46 
  47 import jdk.internal.access.JavaLangAccess;
  48 import jdk.internal.access.SharedSecrets;
  49 
  50 /**
  51  * Supports logging of access to members of exported and concealed packages
  52  * that are opened to code in unnamed modules for illegal access.
  53  */
  54 
  55 public final class IllegalAccessLogger {
  56 
  57     /**
  58      * Logger modes
  59      */
  60     public enum Mode {
  61         /**
  62          * Prints a warning when an illegal access succeeds and then
  63          * discards the logger so that there is no further output.
  64          */
  65         ONESHOT,
  66         /**
  67          * Print warnings when illegal access succeeds
  68          */
  69         WARN,
  70         /**
  71          * Prints warnings and a stack trace when illegal access succeeds
  72          */
  73         DEBUG,
  74     }
  75 
  76     /**
  77      * A builder for IllegalAccessLogger objects.
  78      */
  79     public static class Builder {
  80         private final Mode mode;


 101          * Adding logging of reflective-access to any member of a type in
 102          * otherwise concealed packages.
 103          */
 104         public Builder logAccessToConcealedPackages(Module m, Set<String> packages) {
 105             ensureNotComplete();
 106             moduleToConcealedPackages.put(m, unmodifiableSet(packages));
 107             return this;
 108         }
 109 
 110         /**
 111          * Adding logging of reflective-access to non-public members/types in
 112          * otherwise exported (not open) packages.
 113          */
 114         public Builder logAccessToExportedPackages(Module m, Set<String> packages) {
 115             ensureNotComplete();
 116             moduleToExportedPackages.put(m, unmodifiableSet(packages));
 117             return this;
 118         }
 119 
 120         /**
 121          * Builds the IllegalAccessLogger and sets it as the system-wide logger.
 122          */
 123         public void complete() {
 124             Map<Module, Set<String>> map1 = unmodifiableMap(moduleToConcealedPackages);
 125             Map<Module, Set<String>> map2 = unmodifiableMap(moduleToExportedPackages);
 126             logger = new IllegalAccessLogger(mode, warningStream, map1, map2);
 127             complete = true;
 128         }
 129     }
 130 
 131     // need access to java.lang.Module
 132     private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
 133 
 134     // system-wide IllegalAccessLogger
 135     private static volatile IllegalAccessLogger logger;
 136 
 137     // logger mode
 138     private final Mode mode;
 139 
 140     // the print stream to send the warnings
 141     private final PrintStream warningStream;


< prev index next >