Ticket #15451: plugin-prefs.patch

File plugin-prefs.patch, 22.1 KB (added by bastiK, 7 years ago)
  • src/org/openstreetmap/josm/Main.java

     
    4848import org.openstreetmap.josm.io.FileWatcher;
    4949import org.openstreetmap.josm.io.OnlineResource;
    5050import org.openstreetmap.josm.io.OsmApi;
     51import org.openstreetmap.josm.plugins.PluginHandler;
    5152import org.openstreetmap.josm.spi.preferences.Config;
    5253import org.openstreetmap.josm.tools.CheckParameterUtil;
    5354import org.openstreetmap.josm.tools.ImageProvider;
     
    761762        } catch (IOException ex) {
    762763            Logging.log(Logging.LEVEL_WARN, tr("Failed to save default preferences."), ex);
    763764        }
     765        PluginHandler.shutdown();
    764766        if (!GraphicsEnvironment.isHeadless()) {
    765767            ImageProvider.shutdown(true);
    766768        }
  • src/org/openstreetmap/josm/data/Preferences.java

     
    55import static org.openstreetmap.josm.tools.I18n.tr;
    66
    77import java.awt.Color;
    8 import java.awt.GraphicsEnvironment;
    9 import java.awt.Toolkit;
    108import java.io.File;
    119import java.io.IOException;
    1210import java.io.PrintWriter;
     
    1412import java.io.StringWriter;
    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;
    2017import java.util.Collection;
     
    2724import java.util.Map;
    2825import java.util.Map.Entry;
    2926import java.util.Optional;
    30 import java.util.ResourceBundle;
    3127import java.util.Set;
    3228import java.util.SortedMap;
    3329import java.util.TreeMap;
     
    4541import org.openstreetmap.josm.data.preferences.DoubleProperty;
    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;
    5047import org.openstreetmap.josm.data.preferences.PreferencesReader;
     
    10299
    103100    private static final long MAX_AGE_DEFAULT_PREFERENCES = TimeUnit.DAYS.toSeconds(50);
    104101
    105     /**
    106      * Internal storage for the preference directory.
    107      * Do not access this variable directly!
    108      * @see #getPreferencesDirectory()
    109      */
    110     private File preferencesDir;
     102    private final IBaseDirectories dirs;
    111103
    112104    /**
    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;
    121 
    122     /**
    123105     * Determines if preferences file is saved each time a property is changed.
    124106     */
    125107    private boolean saveOnPut = true;
     
    246228     */
    247229    public Preferences() {
    248230        // Default constructor
     231        this.dirs = new JosmBaseDirectories();
    249232    }
    250233
     234    public Preferences(IBaseDirectories dirs) {
     235        this.dirs = dirs;
     236    }
     237
    251238    /**
    252239     * Constructs a new {@code Preferences} from an existing instance.
    253240     * @param pref existing preferences to copy
     
    255242     */
    256243    @SuppressWarnings("deprecation")
    257244    public Preferences(Preferences pref) {
     245        this(pref.dirs);
    258246        settingsMap.putAll(pref.settingsMap);
    259247        defaultsMap.putAll(pref.defaultsMap);
    260248        colornames.putAll(pref.colornames);
     
    431419
    432420    @Override
    433421    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;
     422        return dirs.getPreferencesDirectory(createIfMissing);
    458423    }
    459424
    460425    /**
     
    471436
    472437    @Override
    473438    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;
     439        return dirs.getUserDataDirectory(createIfMissing);
    498440    }
    499441
    500442    /**
     
    536478
    537479    @Override
    538480    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;
     481        return dirs.getCacheDirectory(createIfMissing);
    567482    }
    568483
    569484    private static void addPossibleResourceDir(Set<String> locations, String s) {
     
    781696        if (!defaults) {
    782697            /* currently unused, but may help to fix configuration issues in future */
    783698            putInt("josm.version", Version.getInstance().getVersion());
    784 
    785             updateSystemProperties();
    786699        }
    787700
    788701        File backupFile = new File(prefFile + "_backup");
     
    836749        reader.parse();
    837750        settingsMap.clear();
    838751        settingsMap.putAll(reader.getSettings());
    839         updateSystemProperties();
    840752        removeObsolete(reader.getVersion());
    841753    }
    842754
     
    983895     */
    984896    public void resetToInitialState() {
    985897        resetToDefault();
    986         preferencesDir = null;
    987         cacheDir = null;
    988         userdataDir = null;
    989898        saveOnPut = true;
    990899        initSuccessful = false;
    991900    }
     
    15041413    }
    15051414
    15061415    /**
    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     /**
    15381416     * Replies the collection of plugin site URLs from where plugin lists can be downloaded.
    15391417     * @return the collection of plugin site URLs
    15401418     * @see #getOnlinePluginSites
  • src/org/openstreetmap/josm/data/preferences/JosmBaseDirectories.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.data.preferences;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.io.File;
     7
     8import javax.swing.JOptionPane;
     9
     10import org.openstreetmap.josm.Main;
     11import org.openstreetmap.josm.spi.preferences.IBaseDirectories;
     12import org.openstreetmap.josm.tools.Logging;
     13
     14/**
     15 *
     16 * @since xxx
     17 */
     18public class JosmBaseDirectories implements IBaseDirectories {
     19    /**
     20     * Internal storage for the preference directory.
     21     */
     22    private File preferencesDir;
     23
     24    /**
     25     * Internal storage for the cache directory.
     26     */
     27    private File cacheDir;
     28
     29    /**
     30     * Internal storage for the user data directory.
     31     */
     32    private File userdataDir;
     33
     34    @Override
     35    public File getPreferencesDirectory(boolean createIfMissing) {
     36        if (preferencesDir == null) {
     37            String path;
     38            path = System.getProperty("josm.pref");
     39            if (path != null) {
     40                preferencesDir = new File(path).getAbsoluteFile();
     41            } else {
     42                path = System.getProperty("josm.home");
     43                if (path != null) {
     44                    preferencesDir = new File(path).getAbsoluteFile();
     45                } else {
     46                    preferencesDir = Main.platform.getDefaultPrefDirectory();
     47                }
     48            }
     49        }
     50        if (createIfMissing && !preferencesDir.exists() && !preferencesDir.mkdirs()) {
     51            Logging.warn(tr("Failed to create missing preferences directory: {0}", preferencesDir.getAbsoluteFile()));
     52            JOptionPane.showMessageDialog(
     53                    Main.parent,
     54                    tr("<html>Failed to create missing preferences directory: {0}</html>", preferencesDir.getAbsoluteFile()),
     55                    tr("Error"),
     56                    JOptionPane.ERROR_MESSAGE
     57            );
     58        }
     59        return preferencesDir;
     60    }
     61
     62    @Override
     63    public File getUserDataDirectory(boolean createIfMissing) {
     64        if (userdataDir == null) {
     65            String path;
     66            path = System.getProperty("josm.userdata");
     67            if (path != null) {
     68                userdataDir = new File(path).getAbsoluteFile();
     69            } else {
     70                path = System.getProperty("josm.home");
     71                if (path != null) {
     72                    userdataDir = new File(path).getAbsoluteFile();
     73                } else {
     74                    userdataDir = Main.platform.getDefaultUserDataDirectory();
     75                }
     76            }
     77        }
     78        if (createIfMissing && !userdataDir.exists() && !userdataDir.mkdirs()) {
     79            Logging.warn(tr("Failed to create missing user data directory: {0}", userdataDir.getAbsoluteFile()));
     80            JOptionPane.showMessageDialog(
     81                    Main.parent,
     82                    tr("<html>Failed to create missing user data directory: {0}</html>", userdataDir.getAbsoluteFile()),
     83                    tr("Error"),
     84                    JOptionPane.ERROR_MESSAGE
     85            );
     86        }
     87        return userdataDir;
     88    }
     89
     90    @Override
     91    public File getCacheDirectory(boolean createIfMissing) {
     92        if (cacheDir == null) {
     93            String path = System.getProperty("josm.cache");
     94            if (path != null) {
     95                cacheDir = new File(path).getAbsoluteFile();
     96            } else {
     97                path = System.getProperty("josm.home");
     98                if (path != null) {
     99                    cacheDir = new File(path, "cache");
     100                } else {
     101                    cacheDir = Main.platform.getDefaultCacheDirectory();
     102                }
     103            }
     104        }
     105        if (createIfMissing && !cacheDir.exists() && !cacheDir.mkdirs()) {
     106            Logging.warn(tr("Failed to create missing cache directory: {0}", cacheDir.getAbsoluteFile()));
     107            JOptionPane.showMessageDialog(
     108                    Main.parent,
     109                    tr("<html>Failed to create missing cache directory: {0}</html>", cacheDir.getAbsoluteFile()),
     110                    tr("Error"),
     111                    JOptionPane.ERROR_MESSAGE
     112            );
     113        }
     114        return cacheDir;
     115    }
     116
     117}
  • src/org/openstreetmap/josm/gui/MainApplication.java

    Property changes on: src/org/openstreetmap/josm/data/preferences/JosmBaseDirectories.java
    ___________________________________________________________________
    Added: svn:eol-style
    ## -0,0 +1 ##
    +native
    \ No newline at end of property
     
    1010import java.awt.Font;
    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;
    1921import java.net.InetAddress;
     
    3739import java.util.Map;
    3840import java.util.Objects;
    3941import java.util.Optional;
     42import java.util.ResourceBundle;
    4043import java.util.Set;
    4144import java.util.TreeSet;
    4245import java.util.concurrent.Callable;
     
    147150import org.openstreetmap.josm.plugins.PluginHandler;
    148151import org.openstreetmap.josm.plugins.PluginInformation;
    149152import org.openstreetmap.josm.spi.preferences.Config;
     153import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;
     154import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
    150155import org.openstreetmap.josm.tools.FontsManager;
    151156import org.openstreetmap.josm.tools.GBC;
    152157import org.openstreetmap.josm.tools.HttpClient;
     
    932937        if (!language.isPresent()) {
    933938            I18n.set(Config.getPref().get("language", null));
    934939        }
    935         Main.pref.updateSystemProperties();
     940        updateSystemProperties();
     941        Main.pref.addPreferenceChangeListener(new PreferenceChangedListener() {
     942            @Override
     943            public void preferenceChanged(PreferenceChangeEvent e) {
     944                updateSystemProperties();
     945            }
     946        });
    936947
    937948        checkIPv6();
    938949
     
    10721083    }
    10731084
    10741085    /**
     1086     * Updates system properties with the current values in the preferences.
     1087     */
     1088    public static void updateSystemProperties() {
     1089        if ("true".equals(Config.getPref().get("prefer.ipv6", "auto"))
     1090                && !"true".equals(Utils.updateSystemProperty("java.net.preferIPv6Addresses", "true"))) {
     1091            // never set this to false, only true!
     1092            Logging.info(tr("Try enabling IPv6 network, prefering IPv6 over IPv4 (only works on early startup)."));
     1093        }
     1094        Utils.updateSystemProperty("http.agent", Version.getInstance().getAgentString());
     1095        Utils.updateSystemProperty("user.language", Config.getPref().get("language"));
     1096        // Workaround to fix a Java bug. This ugly hack comes from Sun bug database: https://bugs.openjdk.java.net/browse/JDK-6292739
     1097        // Force AWT toolkit to update its internal preferences (fix #6345).
     1098        // Does not work anymore with Java 9, to remove with Java 9 migration
     1099        if (Utils.getJavaVersion() < 9 && !GraphicsEnvironment.isHeadless()) {
     1100            try {
     1101                Field field = Toolkit.class.getDeclaredField("resources");
     1102                Utils.setObjectsAccessible(field);
     1103                field.set(null, ResourceBundle.getBundle("sun.awt.resources.awt"));
     1104            } catch (ReflectiveOperationException | RuntimeException e) { // NOPMD
     1105                // Catch RuntimeException in order to catch InaccessibleObjectException, new in Java 9
     1106                Logging.warn(e);
     1107            }
     1108        }
     1109        // Possibility to disable SNI (not by default) in case of misconfigured https servers
     1110        // See #9875 + http://stackoverflow.com/a/14884941/2257172
     1111        // then https://josm.openstreetmap.de/ticket/12152#comment:5 for details
     1112        if (Config.getPref().getBoolean("jdk.tls.disableSNIExtension", false)) {
     1113            Utils.updateSystemProperty("jsse.enableSNIExtension", "false");
     1114        }
     1115    }
     1116
     1117    /**
    10751118     * Setup the sources for NTV2 grid shift files for projection support.
    10761119     * @since 12795
    10771120     */
  • src/org/openstreetmap/josm/plugins/Plugin.java

     
    1616import java.util.List;
    1717
    1818import org.openstreetmap.josm.Main;
     19import org.openstreetmap.josm.data.Preferences;
    1920import org.openstreetmap.josm.gui.MapFrame;
    2021import org.openstreetmap.josm.gui.MapFrameListener;
    2122import org.openstreetmap.josm.gui.download.DownloadSelection;
     
    2223import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
    2324import org.openstreetmap.josm.spi.preferences.Config;
    2425import org.openstreetmap.josm.spi.preferences.IBaseDirectories;
     26import org.openstreetmap.josm.spi.preferences.IPreferences;
    2527import org.openstreetmap.josm.tools.Logging;
    2628import org.openstreetmap.josm.tools.Utils;
    2729
     
    5759     */
    5860    private PluginInformation info;
    5961
    60     private final IBaseDirectories pluginBaseDirectories = new PluginBaseDirectories();
     62    private final IBaseDirectories pluginBaseDirectories;
     63    final Preferences pluginPref;
     64    boolean pluginPrefInitialized;
    6165
    6266    private class PluginBaseDirectories implements IBaseDirectories {
    6367        private File preferencesDir;
     
    108112     */
    109113    public Plugin(PluginInformation info) {
    110114        this.info = info;
     115        this.pluginBaseDirectories = new PluginBaseDirectories();
     116        this.pluginPref = new Preferences(pluginBaseDirectories);
    111117    }
    112118
    113119    /**
     
    148154        return new File(Main.pref.getPluginsDirectory(), info.name).getPath();
    149155    }
    150156
     157    public IPreferences getPref() {
     158        if (!pluginPrefInitialized) {
     159            // lazy initialization, so it will not create directories and files
     160            // when preferences is not accessed by the plugin
     161            pluginPref.init(false);
     162            pluginPrefInitialized = true;
     163        }
     164        return pluginPref;
     165    }
     166
    151167    @Override
    152168    public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {}
    153169
  • src/org/openstreetmap/josm/plugins/PluginHandler.java

     
    15541554        return result;
    15551555    }
    15561556
     1557    public static void shutdown() {
     1558        for (PluginProxy pp : pluginList) {
     1559            Utils.instanceOfAndCast(pp.getPlugin(), Plugin.class)
     1560                    .filter(plugin -> plugin.pluginPrefInitialized).ifPresent(plugin -> {
     1561                try {
     1562                    plugin.pluginPref.saveDefaults();
     1563                } catch (IOException ex) {
     1564                    Logging.log(Logging.LEVEL_WARN,
     1565                            tr("Failed to save default preferences for plugin {0}.", plugin.getPluginInformation().name), ex);
     1566                }
     1567            });
     1568        }
     1569    }
     1570
    15571571    private static class UpdatePluginsMessagePanel extends JPanel {
    15581572        private final JMultilineLabel lblMessage = new JMultilineLabel("");
    15591573        private final JCheckBox cbDontShowAgain = new JCheckBox(