//#* © 2016 and later: Unicode, Inc. and others.
//#* License & terms of use: http://www.unicode.org/copyright.html#License
//#
//#*******************************************************************************
//#* Copyright (C) 1997-2015, International Business Machines Corporation and    *
//#* others. All Rights Reserved.                                                *
//#*******************************************************************************
//#* This is the ant build file for ICU4J.  See readme.html for more information.
//#*
// policies needed to run tests
grant
{
    // temporary for debugging
    // permission java.lang.RuntimePermission "getProtectionDomain";

    permission java.lang.RuntimePermission "accessDeclaredMembers";

    // needed for Locale.setDefault, only used in tests and demos
    permission java.util.PropertyPermission "user.language", "write";

    // for charsets
    permission java.lang.RuntimePermission "charsetProvider", "read";

    // IBM 1.6 on Windows does not allow to use reflection to access
    // getDSTSavings in TimeZone implementation class in sun.util.clanedar.
    permission java.lang.RuntimePermission "accessClassInPackage.sun.util.calendar";

    // for testing lenient decimal/group separator parsing
    permission java.util.PropertyPermission "com.ibm.icu.text.DecimalFormat.SkipExtendedSeparatorParsing", "write";

    // for setting the default time zone by the test framework
    permission java.util.PropertyPermission "user.timezone", "write";

    // for creating a fallback class loader
    permission java.lang.RuntimePermission "createClassLoader";
};

// there must be a way for code in one jar file to call code in another jar
// file and give the called code permission to read the calling code's
// jar.  they're in different protection domains despite being on the
// same classpath and being loaded by the same class loader, so the class
// loader doesn't disambiguate which protection domain we're using. it's
// not easy to figure out the security docs, sigh.
//
// this is so ICUData (in icu4j.jar), called from test code (in core/charset tests jar)
// can read test resource files (in core/charset tests jar)
//
grant codebase "file:${user.dir}/icu4j.jar"
{
    permission java.io.FilePermission "${/}${user.dir}${/}icu4jtests.jar", "read";
    permission java.io.FilePermission "${/}${user.dir}${/}icu4j-charset.jar", "read";

    permission java.util.PropertyPermission "com.ibm.icu.util.TimeZone.DefaultTimeZoneType", "read";
    permission java.util.PropertyPermission "com.ibm.icu.text.DecimalFormat.SkipExtendedSeparatorParsing", "read";
};

grant codebase "file:${user.dir}/icu4jtests.jar"
{
    permission java.io.FilePermission "${/}${user.dir}${/}icu4j.jar", "read";
};