Path: blob/master/test/jdk/java/lang/System/LoggerFinder/BaseLoggerFinderTest/BaseLoggerFinderTest.java
41154 views
/*1* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/22import java.security.AccessControlException;23import java.security.CodeSource;24import java.security.Permission;25import java.security.PermissionCollection;26import java.security.Permissions;27import java.security.Policy;28import java.security.ProtectionDomain;29import java.util.Collections;30import java.util.Enumeration;31import java.util.HashMap;32import java.util.Map;33import java.util.ResourceBundle;34import java.util.stream.Stream;35import java.util.concurrent.ConcurrentHashMap;36import java.util.concurrent.atomic.AtomicBoolean;37import java.util.concurrent.atomic.AtomicLong;38import java.util.function.Supplier;39import java.lang.System.LoggerFinder;40import java.lang.System.Logger;41import java.lang.System.Logger.Level;4243/**44* @test45* @bug 814036446* @summary Tests a naive implementation of LoggerFinder, and in particular47* the default body of System.Logger methods.48* @build AccessSystemLogger BaseLoggerFinderTest CustomSystemClassLoader BaseLoggerFinder TestLoggerFinder49* @run driver AccessSystemLogger50* @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader BaseLoggerFinderTest NOSECURITY51* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader BaseLoggerFinderTest NOPERMISSIONS52* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader BaseLoggerFinderTest WITHPERMISSIONS53* @author danielfuchs54*/55public class BaseLoggerFinderTest {5657static final RuntimePermission LOGGERFINDER_PERMISSION =58new RuntimePermission("loggerFinder");59final static boolean VERBOSE = false;60static final ThreadLocal<AtomicBoolean> allowControl = new ThreadLocal<AtomicBoolean>() {61@Override62protected AtomicBoolean initialValue() {63return new AtomicBoolean(false);64}65};66static final ThreadLocal<AtomicBoolean> allowAccess = new ThreadLocal<AtomicBoolean>() {67@Override68protected AtomicBoolean initialValue() {69return new AtomicBoolean(false);70}71};7273final static AccessSystemLogger accessSystemLogger = new AccessSystemLogger();74static final Class<?> providerClass;75static {76try {77providerClass = ClassLoader.getSystemClassLoader().loadClass("BaseLoggerFinder");78} catch (ClassNotFoundException ex) {79throw new ExceptionInInitializerError(ex);80}81}8283public static class MyBundle extends ResourceBundle {8485final ConcurrentHashMap<String,String> map = new ConcurrentHashMap<>();8687@Override88protected Object handleGetObject(String key) {89if (key.contains(" (translated)")) {90throw new RuntimeException("Unexpected key: " + key);91}92return map.computeIfAbsent(key, k -> k + " (translated)");93}9495@Override96public Enumeration<String> getKeys() {97return Collections.enumeration(map.keySet());98}99100}101public static class MyLoggerBundle extends MyBundle {102103}104105static enum TestCases {NOSECURITY, NOPERMISSIONS, WITHPERMISSIONS};106107static void setSecurityManager() {108if (System.getSecurityManager() == null) {109Policy.setPolicy(new SimplePolicy(allowControl, allowAccess));110System.setSecurityManager(new SecurityManager());111}112}113114public static void main(String[] args) {115if (args.length == 0)116args = new String[] {117//"NOSECURITY",118"NOPERMISSIONS",119"WITHPERMISSIONS"120};121122System.out.println("Using provider class: " + providerClass + "[" + providerClass.getClassLoader() + "]");123124Stream.of(args).map(TestCases::valueOf).forEach((testCase) -> {125TestLoggerFinder provider;126switch (testCase) {127case NOSECURITY:128System.out.println("\n*** Without Security Manager\n");129provider = TestLoggerFinder.class.cast(LoggerFinder.getLoggerFinder());130test(provider, true);131System.out.println("Tetscase count: " + TestLoggerFinder.sequencer.get());132break;133case NOPERMISSIONS:134System.out.println("\n*** With Security Manager, without permissions\n");135setSecurityManager();136try {137provider = TestLoggerFinder.class.cast(LoggerFinder.getLoggerFinder());138throw new RuntimeException("Expected exception not raised");139} catch (AccessControlException x) {140if (!LOGGERFINDER_PERMISSION.equals(x.getPermission())) {141throw new RuntimeException("Unexpected permission check", x);142}143final boolean control = allowControl.get().get();144try {145allowControl.get().set(true);146provider = TestLoggerFinder.class.cast(LoggerFinder.getLoggerFinder());147} finally {148allowControl.get().set(control);149}150}151test(provider, false);152System.out.println("Tetscase count: " + TestLoggerFinder.sequencer.get());153break;154case WITHPERMISSIONS:155System.out.println("\n*** With Security Manager, with control permission\n");156setSecurityManager();157final boolean control = allowControl.get().get();158try {159allowControl.get().set(true);160provider = TestLoggerFinder.class.cast(LoggerFinder.getLoggerFinder());161test(provider, true);162} finally {163allowControl.get().set(control);164}165break;166default:167throw new RuntimeException("Unknown test case: " + testCase);168}169});170System.out.println("\nPASSED: Tested " + TestLoggerFinder.sequencer.get() + " cases.");171}172173public static void test(TestLoggerFinder provider, boolean hasRequiredPermissions) {174175ResourceBundle loggerBundle = ResourceBundle.getBundle(MyLoggerBundle.class.getName());176final Map<Logger, String> loggerDescMap = new HashMap<>();177178179// 1. Test loggers returned by LoggerFinder, both for system callers180// and not system callers.181TestLoggerFinder.LoggerImpl appLogger1 = null;182try {183appLogger1 =184TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", BaseLoggerFinderTest.class.getModule()));185loggerDescMap.put(appLogger1, "provider.getLogger(\"foo\", BaseLoggerFinderTest.class.getModule())");186if (!hasRequiredPermissions) {187throw new RuntimeException("Managed to obtain a logger without permission");188}189} catch (AccessControlException acx) {190if (hasRequiredPermissions) {191throw new RuntimeException("Unexpected security exception: ", acx);192}193if (!acx.getPermission().equals(LOGGERFINDER_PERMISSION)) {194throw new RuntimeException("Unexpected permission in exception: " + acx, acx);195}196System.out.println("Got expected exception for logger: " + acx);197final boolean old = allowControl.get().get();198allowControl.get().set(true);199try {200appLogger1 =201TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", BaseLoggerFinderTest.class.getModule()));202loggerDescMap.put(appLogger1, "provider.getLogger(\"foo\", BaseLoggerFinderTest.class.getModule())");203} finally {204allowControl.get().set(old);205}206}207208TestLoggerFinder.LoggerImpl sysLogger1 = null;209try {210sysLogger1 = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class.getModule()));211loggerDescMap.put(sysLogger1, "provider.getLogger(\"foo\", Thread.class.getModule())");212if (!hasRequiredPermissions) {213throw new RuntimeException("Managed to obtain a system logger without permission");214}215} catch (AccessControlException acx) {216if (hasRequiredPermissions) {217throw new RuntimeException("Unexpected security exception: ", acx);218}219if (!acx.getPermission().equals(LOGGERFINDER_PERMISSION)) {220throw new RuntimeException("Unexpected permission in exception: " + acx, acx);221}222System.out.println("Got expected exception for system logger: " + acx);223final boolean old = allowControl.get().get();224allowControl.get().set(true);225try {226sysLogger1 = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class.getModule()));227loggerDescMap.put(sysLogger1, "provider.getLogger(\"foo\", Thread.class.getModule())");228} finally {229allowControl.get().set(old);230}231}232if (appLogger1 == sysLogger1) {233throw new RuntimeException("identical loggers");234}235236if (provider.system.contains(appLogger1)) {237throw new RuntimeException("app logger in system map");238}239if (!provider.user.contains(appLogger1)) {240throw new RuntimeException("app logger not in appplication map");241}242if (provider.user.contains(sysLogger1)) {243throw new RuntimeException("sys logger in appplication map");244}245if (!provider.system.contains(sysLogger1)) {246throw new RuntimeException("sys logger not in system map");247}248249testLogger(provider, loggerDescMap, "foo", null, appLogger1, appLogger1);250testLogger(provider, loggerDescMap, "foo", null, sysLogger1, sysLogger1);251252// 2. Test localized loggers returned LoggerFinder, both for system253// callers and non system callers254Logger appLogger2 = null;255try {256appLogger2 = provider.getLocalizedLogger("foo", loggerBundle, BaseLoggerFinderTest.class.getModule());257loggerDescMap.put(appLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, BaseLoggerFinderTest.class.getModule())");258if (!hasRequiredPermissions) {259throw new RuntimeException("Managed to obtain a logger without permission");260}261} catch (AccessControlException acx) {262if (hasRequiredPermissions) {263throw new RuntimeException("Unexpected security exception: ", acx);264}265if (!acx.getPermission().equals(LOGGERFINDER_PERMISSION)) {266throw new RuntimeException("Unexpected permission in exception: " + acx, acx);267}268System.out.println("Got expected exception for logger: " + acx);269final boolean old = allowControl.get().get();270allowControl.get().set(true);271try {272appLogger2 = provider.getLocalizedLogger("foo", loggerBundle, BaseLoggerFinderTest.class.getModule());273loggerDescMap.put(appLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, BaseLoggerFinderTest.class.getModule())");274} finally {275allowControl.get().set(old);276}277}278279Logger sysLogger2 = null;280try {281sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class.getModule());282loggerDescMap.put(sysLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, Thread.class.getModule())");283if (!hasRequiredPermissions) {284throw new RuntimeException("Managed to obtain a system logger without permission");285}286} catch (AccessControlException acx) {287if (hasRequiredPermissions) {288throw new RuntimeException("Unexpected security exception: ", acx);289}290if (!acx.getPermission().equals(LOGGERFINDER_PERMISSION)) {291throw new RuntimeException("Unexpected permission in exception: " + acx, acx);292}293System.out.println("Got expected exception for localized system logger: " + acx);294final boolean old = allowControl.get().get();295allowControl.get().set(true);296try {297sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class.getModule());298loggerDescMap.put(sysLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, Thread.class.getModule()))");299} finally {300allowControl.get().set(old);301}302}303if (appLogger2 == sysLogger2) {304throw new RuntimeException("identical loggers");305}306if (appLogger2 == appLogger1) {307throw new RuntimeException("identical loggers");308}309if (sysLogger2 == sysLogger1) {310throw new RuntimeException("identical loggers");311}312313if (provider.system.contains(appLogger2)) {314throw new RuntimeException("localized app logger in system map");315}316if (provider.user.contains(appLogger2)) {317throw new RuntimeException("localized app logger in appplication map");318}319if (provider.user.contains(sysLogger2)) {320throw new RuntimeException("localized sys logger in appplication map");321}322if (provider.system.contains(sysLogger2)) {323throw new RuntimeException("localized sys logger not in system map");324}325326testLogger(provider, loggerDescMap, "foo", loggerBundle, appLogger2, appLogger1);327testLogger(provider, loggerDescMap, "foo", loggerBundle, sysLogger2, sysLogger1);328329// 3 Test loggers returned by:330// 3.1: System.getLogger("foo")331Logger appLogger3 = System.getLogger("foo");332loggerDescMap.put(appLogger3, "System.getLogger(\"foo\")");333testLogger(provider, loggerDescMap, "foo", null, appLogger3, appLogger1);334335// 3.2: System.getLogger("foo")336// Emulate what System.getLogger() does when the caller is a337// platform classes338Logger sysLogger3 = accessSystemLogger.getLogger("foo");339loggerDescMap.put(sysLogger3, "AccessSystemLogger.getLogger(\"foo\")");340341if (appLogger3 == sysLogger3) {342throw new RuntimeException("identical loggers");343}344345testLogger(provider, loggerDescMap, "foo", null, sysLogger3, sysLogger1);346347// 4. Test loggers returned by:348// 4.1 System.getLogger("foo", loggerBundle)349Logger appLogger4 =350System.getLogger("foo", loggerBundle);351loggerDescMap.put(appLogger4, "System.getLogger(\"foo\", loggerBundle)");352if (appLogger4 == appLogger1) {353throw new RuntimeException("identical loggers");354}355356testLogger(provider, loggerDescMap, "foo", loggerBundle, appLogger4, appLogger1);357358// 4.2: System.getLogger("foo", loggerBundle)359// Emulate what System.getLogger() does when the caller is a360// platform classes361Logger sysLogger4 = accessSystemLogger.getLogger("foo", loggerBundle);362loggerDescMap.put(sysLogger4, "AccessSystemLogger.getLogger(\"foo\", loggerBundle)");363if (appLogger4 == sysLogger4) {364throw new RuntimeException("identical loggers");365}366367testLogger(provider, loggerDescMap, "foo", loggerBundle, sysLogger4, sysLogger1);368369}370371public static class Foo {372373}374375static void verbose(String msg) {376if (VERBOSE) {377System.out.println(msg);378}379}380381// Calls the 8 methods defined on Logger and verify the382// parameters received by the underlying TestProvider.LoggerImpl383// logger.384private static void testLogger(TestLoggerFinder provider,385Map<Logger, String> loggerDescMap,386String name,387ResourceBundle loggerBundle,388Logger logger,389TestLoggerFinder.LoggerImpl sink) {390391System.out.println("Testing " + loggerDescMap.get(logger) + " [" + logger +"]");392AtomicLong sequencer = TestLoggerFinder.sequencer;393394Foo foo = new Foo();395String fooMsg = foo.toString();396for (Level loggerLevel : Level.values()) {397sink.level = loggerLevel;398for (Level messageLevel : Level.values()) {399String desc = "logger.log(messageLevel, foo): loggerLevel="400+ loggerLevel+", messageLevel="+messageLevel;401TestLoggerFinder.LogEvent expected =402TestLoggerFinder.LogEvent.of(403sequencer.get(),404messageLevel.compareTo(loggerLevel) >= 0,405name, messageLevel, (ResourceBundle)null,406fooMsg, null, (Throwable)null, (Object[])null);407logger.log(messageLevel, foo);408if (loggerLevel == Level.OFF || messageLevel.compareTo(loggerLevel) < 0) {409if (provider.eventQueue.poll() != null) {410throw new RuntimeException("unexpected event in queue for " + desc);411}412} else {413TestLoggerFinder.LogEvent actual = provider.eventQueue.poll();414if (!expected.equals(actual)) {415throw new RuntimeException("mismatch for " + desc416+ "\n\texpected=" + expected417+ "\n\t actual=" + actual);418} else {419verbose("Got expected results for "420+ desc + "\n\t" + expected);421}422}423}424}425426String msg = "blah";427for (Level loggerLevel : Level.values()) {428sink.level = loggerLevel;429for (Level messageLevel : Level.values()) {430String desc = "logger.log(messageLevel, \"blah\"): loggerLevel="431+ loggerLevel+", messageLevel="+messageLevel;432TestLoggerFinder.LogEvent expected =433TestLoggerFinder.LogEvent.of(434sequencer.get(),435messageLevel.compareTo(loggerLevel) >= 0 && loggerLevel != Level.OFF,436name, messageLevel, loggerBundle,437msg, null, (Throwable)null, (Object[])null);438logger.log(messageLevel, msg);439TestLoggerFinder.LogEvent actual = provider.eventQueue.poll();440if (!expected.equals(actual)) {441throw new RuntimeException("mismatch for " + desc442+ "\n\texpected=" + expected443+ "\n\t actual=" + actual);444} else {445verbose("Got expected results for "446+ desc + "\n\t" + expected);447}448}449}450451Supplier<String> fooSupplier = new Supplier<String>() {452@Override453public String get() {454return this.toString();455}456};457458for (Level loggerLevel : Level.values()) {459sink.level = loggerLevel;460for (Level messageLevel : Level.values()) {461String desc = "logger.log(messageLevel, fooSupplier): loggerLevel="462+ loggerLevel+", messageLevel="+messageLevel;463TestLoggerFinder.LogEvent expected =464TestLoggerFinder.LogEvent.of(465sequencer.get(),466messageLevel.compareTo(loggerLevel) >= 0,467name, messageLevel, (ResourceBundle)null,468fooSupplier.get(), null,469(Throwable)null, (Object[])null);470logger.log(messageLevel, fooSupplier);471if (loggerLevel == Level.OFF || messageLevel.compareTo(loggerLevel) < 0) {472if (provider.eventQueue.poll() != null) {473throw new RuntimeException("unexpected event in queue for " + desc);474}475} else {476TestLoggerFinder.LogEvent actual = provider.eventQueue.poll();477if (!expected.equals(actual)) {478throw new RuntimeException("mismatch for " + desc479+ "\n\texpected=" + expected480+ "\n\t actual=" + actual);481} else {482verbose("Got expected results for "483+ desc + "\n\t" + expected);484}485}486}487}488489String format = "two params [{1} {2}]";490Object arg1 = foo;491Object arg2 = msg;492for (Level loggerLevel : Level.values()) {493sink.level = loggerLevel;494for (Level messageLevel : Level.values()) {495String desc = "logger.log(messageLevel, format, params...): loggerLevel="496+ loggerLevel+", messageLevel="+messageLevel;497TestLoggerFinder.LogEvent expected =498TestLoggerFinder.LogEvent.of(499sequencer.get(),500messageLevel.compareTo(loggerLevel) >= 0 && loggerLevel != Level.OFF,501name, messageLevel, loggerBundle,502format, null, (Throwable)null, new Object[] {foo, msg});503logger.log(messageLevel, format, foo, msg);504TestLoggerFinder.LogEvent actual = provider.eventQueue.poll();505if (!expected.equals(actual)) {506throw new RuntimeException("mismatch for " + desc507+ "\n\texpected=" + expected508+ "\n\t actual=" + actual);509} else {510verbose("Got expected results for "511+ desc + "\n\t" + expected);512}513}514}515516Throwable thrown = new Exception("OK: log me!");517for (Level loggerLevel : Level.values()) {518sink.level = loggerLevel;519for (Level messageLevel : Level.values()) {520String desc = "logger.log(messageLevel, \"blah\", thrown): loggerLevel="521+ loggerLevel+", messageLevel="+messageLevel;522TestLoggerFinder.LogEvent expected =523TestLoggerFinder.LogEvent.of(524sequencer.get(),525messageLevel.compareTo(loggerLevel) >= 0 && loggerLevel != Level.OFF,526name, messageLevel, loggerBundle,527msg, null, thrown, (Object[]) null);528logger.log(messageLevel, msg, thrown);529TestLoggerFinder.LogEvent actual = provider.eventQueue.poll();530if (!expected.equals(actual)) {531throw new RuntimeException("mismatch for " + desc532+ "\n\texpected=" + expected533+ "\n\t actual=" + actual);534} else {535verbose("Got expected results for "536+ desc + "\n\t" + expected);537}538}539}540541542for (Level loggerLevel : Level.values()) {543sink.level = loggerLevel;544for (Level messageLevel : Level.values()) {545String desc = "logger.log(messageLevel, thrown, fooSupplier): loggerLevel="546+ loggerLevel+", messageLevel="+messageLevel;547TestLoggerFinder.LogEvent expected =548TestLoggerFinder.LogEvent.of(549sequencer.get(),550messageLevel.compareTo(loggerLevel) >= 0,551name, messageLevel, (ResourceBundle)null,552fooSupplier.get(), null,553(Throwable)thrown, (Object[])null);554logger.log(messageLevel, fooSupplier, thrown);555if (loggerLevel == Level.OFF || messageLevel.compareTo(loggerLevel) < 0) {556if (provider.eventQueue.poll() != null) {557throw new RuntimeException("unexpected event in queue for " + desc);558}559} else {560TestLoggerFinder.LogEvent actual = provider.eventQueue.poll();561if (!expected.equals(actual)) {562throw new RuntimeException("mismatch for " + desc563+ "\n\texpected=" + expected564+ "\n\t actual=" + actual);565} else {566verbose("Got expected results for "567+ desc + "\n\t" + expected);568}569}570}571}572573ResourceBundle bundle = ResourceBundle.getBundle(MyBundle.class.getName());574for (Level loggerLevel : Level.values()) {575sink.level = loggerLevel;576for (Level messageLevel : Level.values()) {577String desc = "logger.log(messageLevel, bundle, format, params...): loggerLevel="578+ loggerLevel+", messageLevel="+messageLevel;579TestLoggerFinder.LogEvent expected =580TestLoggerFinder.LogEvent.of(581sequencer.get(),582messageLevel.compareTo(loggerLevel) >= 0 && loggerLevel != Level.OFF,583name, messageLevel, bundle,584format, null, (Throwable)null, new Object[] {foo, msg});585logger.log(messageLevel, bundle, format, foo, msg);586TestLoggerFinder.LogEvent actual = provider.eventQueue.poll();587if (!expected.equals(actual)) {588throw new RuntimeException("mismatch for " + desc589+ "\n\texpected=" + expected590+ "\n\t actual=" + actual);591} else {592verbose("Got expected results for "593+ desc + "\n\t" + expected);594}595}596}597598for (Level loggerLevel : Level.values()) {599sink.level = loggerLevel;600for (Level messageLevel : Level.values()) {601String desc = "logger.log(messageLevel, bundle, \"blah\", thrown): loggerLevel="602+ loggerLevel+", messageLevel="+messageLevel;603TestLoggerFinder.LogEvent expected =604TestLoggerFinder.LogEvent.of(605sequencer.get(),606messageLevel.compareTo(loggerLevel) >= 0 && loggerLevel != Level.OFF,607name, messageLevel, bundle,608msg, null, thrown, (Object[]) null);609logger.log(messageLevel, bundle, msg, thrown);610TestLoggerFinder.LogEvent actual = provider.eventQueue.poll();611if (!expected.equals(actual)) {612throw new RuntimeException("mismatch for " + desc613+ "\n\texpected=" + expected614+ "\n\t actual=" + actual);615} else {616verbose("Got expected results for "617+ desc + "\n\t" + expected);618}619}620}621}622623final static class PermissionsBuilder {624final Permissions perms;625public PermissionsBuilder() {626this(new Permissions());627}628public PermissionsBuilder(Permissions perms) {629this.perms = perms;630}631public PermissionsBuilder add(Permission p) {632perms.add(p);633return this;634}635public PermissionsBuilder addAll(PermissionCollection col) {636if (col != null) {637for (Enumeration<Permission> e = col.elements(); e.hasMoreElements(); ) {638perms.add(e.nextElement());639}640}641return this;642}643public Permissions toPermissions() {644final PermissionsBuilder builder = new PermissionsBuilder();645builder.addAll(perms);646return builder.perms;647}648}649650public static class SimplePolicy extends Policy {651final static RuntimePermission CONTROL = LOGGERFINDER_PERMISSION;652final static RuntimePermission ACCESS = new RuntimePermission("accessClassInPackage.jdk.internal.logger");653654static final Policy DEFAULT_POLICY = Policy.getPolicy();655656final Permissions permissions;657final ThreadLocal<AtomicBoolean> allowControl;658final ThreadLocal<AtomicBoolean> allowAccess;659public SimplePolicy(ThreadLocal<AtomicBoolean> allowControl, ThreadLocal<AtomicBoolean> allowAccess) {660this.allowControl = allowControl;661this.allowAccess = allowAccess;662permissions = new Permissions();663}664665Permissions getPermissions() {666if (allowControl.get().get() || allowAccess.get().get()) {667PermissionsBuilder builder = new PermissionsBuilder()668.addAll(permissions);669if (allowControl.get().get()) {670builder.add(CONTROL);671}672if (allowAccess.get().get()) {673builder.add(ACCESS);674}675return builder.toPermissions();676}677return permissions;678}679680@Override681public boolean implies(ProtectionDomain domain, Permission permission) {682return getPermissions().implies(permission) || DEFAULT_POLICY.implies(domain, permission);683}684685@Override686public PermissionCollection getPermissions(CodeSource codesource) {687return new PermissionsBuilder().addAll(getPermissions()).toPermissions();688}689690@Override691public PermissionCollection getPermissions(ProtectionDomain domain) {692return new PermissionsBuilder().addAll(getPermissions()).toPermissions();693}694}695}696697698