12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
5aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert * Copyright (C) 2008-2015, International Business Machines Corporation and
6aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert * others. All Rights Reserved.
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.impl;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.IOException;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.InputStream;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.security.AccessControlException;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.security.AccessController;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.security.PrivilegedAction;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.MissingResourceException;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Properties;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * ICUConfig is a class used for accessing ICU4J runtime configuration.
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class ICUConfig {
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final String CONFIG_PROPS_FILE = "/com/ibm/icu/ICUConfig.properties";
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final Properties CONFIG_PROPS;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static {
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CONFIG_PROPS = new Properties();
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            InputStream is = ICUData.getStream(CONFIG_PROPS_FILE);
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (is != null) {
31aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert                try {
32aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert                    CONFIG_PROPS.load(is);
33aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert                } finally {
34aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert                    is.close();
35aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert                }
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (MissingResourceException mre) {
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // If it does not exist, ignore.
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IOException ioe) {
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Any IO errors, ignore
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Get ICU configuration property value for the given name.
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param name The configuration property name
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return The configuration property value, or null if it does not exist.
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static String get(String name) {
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return get(name, null);
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Get ICU configuration property value for the given name.
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param name The configuration property name
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param def The default value
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return The configuration property value.  If the property does not
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * exist, <code>def</code> is returned.
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static String get(String name, String def) {
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String val = null;
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String fname = name;
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (System.getSecurityManager() != null) {
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                val = AccessController.doPrivileged(new PrivilegedAction<String>() {
662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    @Override
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    public String run() {
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        return System.getProperty(fname);
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                });
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (AccessControlException e) {
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // ignore
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // TODO log this message
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            val = System.getProperty(name);
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (val == null) {
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            val = CONFIG_PROPS.getProperty(name, def);
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return val;
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
85