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