Changeset 13021 in josm


Ignore:
Timestamp:
2017-10-18T17:25:29+02:00 (7 years ago)
Author:
bastiK
Message:

make Preferences more generic (see #15229, closes #15451)

  • extract base directories
  • move updateSystemProperties() as it is specific to JOSM-core as a "prefefences client"
Location:
trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/Preferences.java

    r12990 r13021  
    66
    77import java.awt.Color;
    8 import java.awt.GraphicsEnvironment;
    9 import java.awt.Toolkit;
    108import java.io.File;
    119import java.io.IOException;
     
    1513import java.lang.annotation.Retention;
    1614import java.lang.annotation.RetentionPolicy;
    17 import java.lang.reflect.Field;
    1815import java.nio.charset.StandardCharsets;
    1916import java.util.ArrayList;
     
    2825import java.util.Map.Entry;
    2926import java.util.Optional;
    30 import java.util.ResourceBundle;
    3127import java.util.Set;
    3228import java.util.SortedMap;
     
    4642import org.openstreetmap.josm.data.preferences.IntegerProperty;
    4743import org.openstreetmap.josm.data.preferences.ColorInfo;
     44import org.openstreetmap.josm.data.preferences.JosmBaseDirectories;
    4845import org.openstreetmap.josm.data.preferences.LongProperty;
    4946import org.openstreetmap.josm.data.preferences.NamedColorProperty;
     
    6057import org.openstreetmap.josm.io.OfflineAccessException;
    6158import org.openstreetmap.josm.io.OnlineResource;
     59import org.openstreetmap.josm.spi.preferences.Config;
    6260import org.openstreetmap.josm.tools.CheckParameterUtil;
    6361import org.openstreetmap.josm.tools.ColorHelper;
     
    9088 * @since 74
    9189 */
    92 public class Preferences extends AbstractPreferences implements IBaseDirectories {
     90public class Preferences extends AbstractPreferences {
    9391
    9492    private static final String COLOR_PREFIX = "color.";
     
    103101    private static final long MAX_AGE_DEFAULT_PREFERENCES = TimeUnit.DAYS.toSeconds(50);
    104102
    105     /**
    106      * Internal storage for the preference directory.
    107      * Do not access this variable directly!
    108      * @see #getPreferencesDirectory()
    109      */
    110     private File preferencesDir;
    111 
    112     /**
    113      * Internal storage for the cache directory.
    114      */
    115     private File cacheDir;
    116 
    117     /**
    118      * Internal storage for the user data directory.
    119      */
    120     private File userdataDir;
     103    private final IBaseDirectories dirs;
    121104
    122105    /**
     
    246229     */
    247230    public Preferences() {
    248         // Default constructor
     231        this.dirs = Config.getDirs();
     232    }
     233
     234    /**
     235     * Constructs a new {@code Preferences}.
     236     *
     237     * @param dirs the directories to use for saving the preferences
     238     */
     239    public Preferences(IBaseDirectories dirs) {
     240        this.dirs = dirs;
    249241    }
    250242
     
    256248    @SuppressWarnings("deprecation")
    257249    public Preferences(Preferences pref) {
     250        this(pref.dirs);
    258251        settingsMap.putAll(pref.settingsMap);
    259252        defaultsMap.putAll(pref.defaultsMap);
     
    420413
    421414    /**
     415     * Get the base directories associated with this preference instance.
     416     * @return the base directories
     417     */
     418    public IBaseDirectories getDirs() {
     419        return dirs;
     420    }
     421
     422    /**
    422423     * Returns the user defined preferences directory, containing the preferences.xml file
    423424     * @return The user defined preferences directory, containing the preferences.xml file
     
    430431    }
    431432
    432     @Override
     433    /**
     434     * @deprecated use {@link #getDirs()} or (more generally) {@link Config#getDirs()}
     435     */
     436    @Deprecated
    433437    public File getPreferencesDirectory(boolean createIfMissing) {
    434         if (preferencesDir == null) {
    435             String path;
    436             path = System.getProperty("josm.pref");
    437             if (path != null) {
    438                 preferencesDir = new File(path).getAbsoluteFile();
    439             } else {
    440                 path = System.getProperty("josm.home");
    441                 if (path != null) {
    442                     preferencesDir = new File(path).getAbsoluteFile();
    443                 } else {
    444                     preferencesDir = Main.platform.getDefaultPrefDirectory();
    445                 }
    446             }
    447         }
    448         if (createIfMissing && !preferencesDir.exists() && !preferencesDir.mkdirs()) {
    449             Logging.warn(tr("Failed to create missing preferences directory: {0}", preferencesDir.getAbsoluteFile()));
    450             JOptionPane.showMessageDialog(
    451                     Main.parent,
    452                     tr("<html>Failed to create missing preferences directory: {0}</html>", preferencesDir.getAbsoluteFile()),
    453                     tr("Error"),
    454                     JOptionPane.ERROR_MESSAGE
    455             );
    456         }
    457         return preferencesDir;
     438        return dirs.getPreferencesDirectory(createIfMissing);
    458439    }
    459440
     
    470451    }
    471452
    472     @Override
     453    /**
     454     * @deprecated use {@link #getDirs()} or (more generally) {@link Config#getDirs()}
     455     */
     456    @Deprecated
    473457    public File getUserDataDirectory(boolean createIfMissing) {
    474         if (userdataDir == null) {
    475             String path;
    476             path = System.getProperty("josm.userdata");
    477             if (path != null) {
    478                 userdataDir = new File(path).getAbsoluteFile();
    479             } else {
    480                 path = System.getProperty("josm.home");
    481                 if (path != null) {
    482                     userdataDir = new File(path).getAbsoluteFile();
    483                 } else {
    484                     userdataDir = Main.platform.getDefaultUserDataDirectory();
    485                 }
    486             }
    487         }
    488         if (createIfMissing && !userdataDir.exists() && !userdataDir.mkdirs()) {
    489             Logging.warn(tr("Failed to create missing user data directory: {0}", userdataDir.getAbsoluteFile()));
    490             JOptionPane.showMessageDialog(
    491                     Main.parent,
    492                     tr("<html>Failed to create missing user data directory: {0}</html>", userdataDir.getAbsoluteFile()),
    493                     tr("Error"),
    494                     JOptionPane.ERROR_MESSAGE
    495             );
    496         }
    497         return userdataDir;
     458        return dirs.getUserDataDirectory(createIfMissing);
    498459    }
    499460
     
    535496    }
    536497
    537     @Override
     498    /**
     499     * @deprecated use {@link #getDirs()} or (more generally) {@link Config#getDirs()}
     500     */
     501    @Deprecated
    538502    public File getCacheDirectory(boolean createIfMissing) {
    539         if (cacheDir == null) {
    540             String path = System.getProperty("josm.cache");
    541             if (path != null) {
    542                 cacheDir = new File(path).getAbsoluteFile();
    543             } else {
    544                 path = System.getProperty("josm.home");
    545                 if (path != null) {
    546                     cacheDir = new File(path, "cache");
    547                 } else {
    548                     path = get("cache.folder", null);
    549                     if (path != null) {
    550                         cacheDir = new File(path).getAbsoluteFile();
    551                     } else {
    552                         cacheDir = Main.platform.getDefaultCacheDirectory();
    553                     }
    554                 }
    555             }
    556         }
    557         if (createIfMissing && !cacheDir.exists() && !cacheDir.mkdirs()) {
    558             Logging.warn(tr("Failed to create missing cache directory: {0}", cacheDir.getAbsoluteFile()));
    559             JOptionPane.showMessageDialog(
    560                     Main.parent,
    561                     tr("<html>Failed to create missing cache directory: {0}</html>", cacheDir.getAbsoluteFile()),
    562                     tr("Error"),
    563                     JOptionPane.ERROR_MESSAGE
    564             );
    565         }
    566         return cacheDir;
     503        return dirs.getCacheDirectory(createIfMissing);
    567504    }
    568505
     
    782719            /* currently unused, but may help to fix configuration issues in future */
    783720            putInt("josm.version", Version.getInstance().getVersion());
    784 
    785             updateSystemProperties();
    786721        }
    787722
     
    837772        settingsMap.clear();
    838773        settingsMap.putAll(reader.getSettings());
    839         updateSystemProperties();
    840774        removeObsolete(reader.getVersion());
    841775    }
     
    984918    public void resetToInitialState() {
    985919        resetToDefault();
    986         preferencesDir = null;
    987         cacheDir = null;
    988         userdataDir = null;
    989920        saveOnPut = true;
    990921        initSuccessful = false;
     
    15051436
    15061437    /**
    1507      * Updates system properties with the current values in the preferences.
    1508      */
    1509     public void updateSystemProperties() {
    1510         if ("true".equals(get("prefer.ipv6", "auto")) && !"true".equals(Utils.updateSystemProperty("java.net.preferIPv6Addresses", "true"))) {
    1511             // never set this to false, only true!
    1512             Logging.info(tr("Try enabling IPv6 network, prefering IPv6 over IPv4 (only works on early startup)."));
    1513         }
    1514         Utils.updateSystemProperty("http.agent", Version.getInstance().getAgentString());
    1515         Utils.updateSystemProperty("user.language", get("language"));
    1516         // Workaround to fix a Java bug. This ugly hack comes from Sun bug database: https://bugs.openjdk.java.net/browse/JDK-6292739
    1517         // Force AWT toolkit to update its internal preferences (fix #6345).
    1518         // Does not work anymore with Java 9, to remove with Java 9 migration
    1519         if (Utils.getJavaVersion() < 9 && !GraphicsEnvironment.isHeadless()) {
    1520             try {
    1521                 Field field = Toolkit.class.getDeclaredField("resources");
    1522                 Utils.setObjectsAccessible(field);
    1523                 field.set(null, ResourceBundle.getBundle("sun.awt.resources.awt"));
    1524             } catch (ReflectiveOperationException | RuntimeException e) { // NOPMD
    1525                 // Catch RuntimeException in order to catch InaccessibleObjectException, new in Java 9
    1526                 Logging.warn(e);
    1527             }
    1528         }
    1529         // Possibility to disable SNI (not by default) in case of misconfigured https servers
    1530         // See #9875 + http://stackoverflow.com/a/14884941/2257172
    1531         // then https://josm.openstreetmap.de/ticket/12152#comment:5 for details
    1532         if (getBoolean("jdk.tls.disableSNIExtension", false)) {
    1533             Utils.updateSystemProperty("jsse.enableSNIExtension", "false");
    1534         }
    1535     }
    1536 
    1537     /**
    15381438     * Replies the collection of plugin site URLs from where plugin lists can be downloaded.
    15391439     * @return the collection of plugin site URLs
  • trunk/src/org/openstreetmap/josm/gui/MainApplication.java

    r12928 r13021  
    1111import java.awt.GraphicsEnvironment;
    1212import java.awt.GridBagLayout;
     13import java.awt.Toolkit;
    1314import java.awt.event.KeyEvent;
    1415import java.io.File;
    1516import java.io.IOException;
    1617import java.io.InputStream;
     18import java.lang.reflect.Field;
    1719import java.net.Authenticator;
    1820import java.net.Inet6Address;
     
    3840import java.util.Objects;
    3941import java.util.Optional;
     42import java.util.ResourceBundle;
    4043import java.util.Set;
    4144import java.util.TreeSet;
     
    9093import org.openstreetmap.josm.data.osm.UserInfo;
    9194import org.openstreetmap.josm.data.osm.search.SearchMode;
     95import org.openstreetmap.josm.data.preferences.JosmBaseDirectories;
    9296import org.openstreetmap.josm.data.preferences.sources.SourceType;
    9397import org.openstreetmap.josm.data.projection.ProjectionCLI;
     
    148152import org.openstreetmap.josm.plugins.PluginInformation;
    149153import org.openstreetmap.josm.spi.preferences.Config;
     154import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;
     155import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
    150156import org.openstreetmap.josm.tools.FontsManager;
    151157import org.openstreetmap.josm.tools.GBC;
     
    926932        Main.pref.init(args.hasOption(Option.RESET_PREFERENCES));
    927933        Config.setPreferencesInstance(Main.pref);
    928         Config.setBaseDirectoriesProvider(Main.pref);
     934        Config.setBaseDirectoriesProvider(JosmBaseDirectories.getInstance());
    929935
    930936        args.getPreferencesToSet().forEach(Main.pref::put);
     
    933939            I18n.set(Config.getPref().get("language", null));
    934940        }
    935         Main.pref.updateSystemProperties();
     941        updateSystemProperties();
     942        Main.pref.addPreferenceChangeListener(new PreferenceChangedListener() {
     943            @Override
     944            public void preferenceChanged(PreferenceChangeEvent e) {
     945                updateSystemProperties();
     946            }
     947        });
    936948
    937949        checkIPv6();
     
    10691081            Logging.info("Enabled EDT checker, wrongful access to gui from non EDT thread will be printed to console");
    10701082            RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager());
     1083        }
     1084    }
     1085
     1086    /**
     1087     * Updates system properties with the current values in the preferences.
     1088     */
     1089    private static void updateSystemProperties() {
     1090        if ("true".equals(Config.getPref().get("prefer.ipv6", "auto"))
     1091                && !"true".equals(Utils.updateSystemProperty("java.net.preferIPv6Addresses", "true"))) {
     1092            // never set this to false, only true!
     1093            Logging.info(tr("Try enabling IPv6 network, prefering IPv6 over IPv4 (only works on early startup)."));
     1094        }
     1095        Utils.updateSystemProperty("http.agent", Version.getInstance().getAgentString());
     1096        Utils.updateSystemProperty("user.language", Config.getPref().get("language"));
     1097        // Workaround to fix a Java bug. This ugly hack comes from Sun bug database: https://bugs.openjdk.java.net/browse/JDK-6292739
     1098        // Force AWT toolkit to update its internal preferences (fix #6345).
     1099        // Does not work anymore with Java 9, to remove with Java 9 migration
     1100        if (Utils.getJavaVersion() < 9 && !GraphicsEnvironment.isHeadless()) {
     1101            try {
     1102                Field field = Toolkit.class.getDeclaredField("resources");
     1103                Utils.setObjectsAccessible(field);
     1104                field.set(null, ResourceBundle.getBundle("sun.awt.resources.awt"));
     1105            } catch (ReflectiveOperationException | RuntimeException e) { // NOPMD
     1106                // Catch RuntimeException in order to catch InaccessibleObjectException, new in Java 9
     1107                Logging.warn(e);
     1108            }
     1109        }
     1110        // Possibility to disable SNI (not by default) in case of misconfigured https servers
     1111        // See #9875 + http://stackoverflow.com/a/14884941/2257172
     1112        // then https://josm.openstreetmap.de/ticket/12152#comment:5 for details
     1113        if (Config.getPref().getBoolean("jdk.tls.disableSNIExtension", false)) {
     1114            Utils.updateSystemProperty("jsse.enableSNIExtension", "false");
    10711115        }
    10721116    }
  • trunk/src/org/openstreetmap/josm/gui/mappaint/RenderingCLI.java

    r12966 r13021  
    2424import org.openstreetmap.josm.Main;
    2525import org.openstreetmap.josm.data.Bounds;
    26 import org.openstreetmap.josm.data.Preferences;
    2726import org.openstreetmap.josm.data.ProjectionBounds;
    2827import org.openstreetmap.josm.data.coor.EastNorth;
     
    3029import org.openstreetmap.josm.data.coor.conversion.LatLonParser;
    3130import org.openstreetmap.josm.data.osm.DataSet;
     31import org.openstreetmap.josm.data.preferences.JosmBaseDirectories;
    3232import org.openstreetmap.josm.data.projection.Projection;
    3333import org.openstreetmap.josm.data.projection.Projections;
     
    419419        Logging.setLogLevel(getLogLevel());
    420420
    421         Config.setBaseDirectoriesProvider(new Preferences()); // for right-left-hand traffic cache file
     421        Config.setBaseDirectoriesProvider(JosmBaseDirectories.getInstance()); // for right-left-hand traffic cache file
    422422        Config.setPreferencesInstance(new MemoryPreferences());
    423423        Config.getPref().putBoolean("mappaint.auto_reload_local_styles", false); // unnecessary to listen for external changes
  • trunk/test/unit/org/openstreetmap/josm/JOSMFixture.java

    r12855 r13021  
    1616import org.openstreetmap.josm.actions.DeleteAction;
    1717import org.openstreetmap.josm.command.DeleteCommand;
     18import org.openstreetmap.josm.data.preferences.JosmBaseDirectories;
    1819import org.openstreetmap.josm.data.projection.Projections;
    1920import org.openstreetmap.josm.gui.MainApplication;
     
    9899        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    99100        Config.setPreferencesInstance(Main.pref);
    100         Config.setBaseDirectoriesProvider(Main.pref);
     101        Config.setBaseDirectoriesProvider(JosmBaseDirectories.getInstance());
    101102        Main.pref.resetToInitialState();
    102103        Main.pref.enableSaveOnPut(false);
  • trunk/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java

    r12855 r13021  
    2020import org.openstreetmap.josm.data.osm.User;
    2121import org.openstreetmap.josm.data.osm.event.SelectionEventManager;
     22import org.openstreetmap.josm.data.preferences.JosmBaseDirectories;
    2223import org.openstreetmap.josm.data.projection.Projections;
    2324import org.openstreetmap.josm.gui.MainApplication;
     
    3132import org.openstreetmap.josm.io.OsmConnection;
    3233import org.openstreetmap.josm.io.OsmTransferCanceledException;
     34import org.openstreetmap.josm.spi.preferences.Config;
    3335import org.openstreetmap.josm.tools.I18n;
    3436import org.openstreetmap.josm.tools.JosmRuntimeException;
     
    4042
    4143import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
    42 import org.openstreetmap.josm.spi.preferences.Config;
    4344
    4445/**
     
    278279
    279280        Config.setPreferencesInstance(Main.pref);
    280         Config.setBaseDirectoriesProvider(Main.pref);
     281        Config.setBaseDirectoriesProvider(JosmBaseDirectories.getInstance());
    281282        // All tests use the same timezone.
    282283        TimeZone.setDefault(DateUtils.UTC);
Note: See TracChangeset for help on using the changeset viewer.