Ticket #18277: 18277.1.patch

File 18277.1.patch, 4.2 KB (added by taylor.smock, 4 years ago)

Move calls for plugin destroy functions out of PluginPreference.java

  • src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java

     
    5555import org.openstreetmap.josm.gui.util.GuiHelper;
    5656import org.openstreetmap.josm.gui.widgets.FilterField;
    5757import org.openstreetmap.josm.plugins.PluginDownloadTask;
     58import org.openstreetmap.josm.plugins.PluginHandler;
    5859import org.openstreetmap.josm.plugins.PluginInformation;
    5960import org.openstreetmap.josm.plugins.ReadLocalPluginInformationTask;
    6061import org.openstreetmap.josm.plugins.ReadRemotePluginInformationTask;
     
    324325            List<String> l = new LinkedList<>(model.getSelectedPluginNames());
    325326            Collections.sort(l);
    326327            Config.getPref().putList("plugins", l);
    327             if (!model.getNewlyDeactivatedPlugins().isEmpty())
    328                 return true;
     328            List<PluginInformation> deactivatedPlugins = model.getNewlyDeactivatedPlugins();
     329            if (!deactivatedPlugins.isEmpty()) {
     330                boolean requiresRestart = PluginHandler.removePlugins(deactivatedPlugins);
     331                if (requiresRestart)
     332                    return requiresRestart;
     333            }
    329334            for (PluginInformation pi : model.getNewlyActivatedPlugins()) {
    330335                if (!pi.canloadatruntime)
    331336                    return true;
  • src/org/openstreetmap/josm/plugins/PluginHandler.java

     
    6868import org.openstreetmap.josm.io.OfflineAccessException;
    6969import org.openstreetmap.josm.io.OnlineResource;
    7070import org.openstreetmap.josm.spi.preferences.Config;
     71import org.openstreetmap.josm.tools.Destroyable;
    7172import org.openstreetmap.josm.tools.GBC;
    7273import org.openstreetmap.josm.tools.I18n;
    7374import org.openstreetmap.josm.tools.ImageProvider;
     
    11671168                        pluginsToDownload,
    11681169                        tr("Update plugins")
    11691170                );
    1170 
    11711171                try {
    11721172                    pluginDownloadTask.run();
    11731173                } catch (RuntimeException e) { // NOPMD
     
    13311331                    URL oldPluginURL = updatedPlugin.toURI().toURL();
    13321332                    pluginsToLoad.stream().filter(x -> x.libraries.contains(oldPluginURL)).forEach(
    13331333                            x -> Collections.replaceAll(x.libraries, oldPluginURL, newPluginURL));
     1334
     1335                    // Attempt to update loaded plugin (must implement Destroyable)
     1336                    PluginInformation tInfo = pluginsToLoad.parallelStream()
     1337                            .filter(x -> x.libraries.contains(newPluginURL)).findAny().orElse(null);
     1338                    if (tInfo != null) {
     1339                        Object tUpdatedPlugin = getPlugin(tInfo.name);
     1340                        if (tUpdatedPlugin instanceof Destroyable) {
     1341                            ((Destroyable) tUpdatedPlugin).destroy();
     1342                            PluginHandler.loadPlugins(getInfoPanel(), Collections.singleton(tInfo),
     1343                                    NullProgressMonitor.INSTANCE);
     1344                        }
     1345                    }
    13341346                } catch (MalformedURLException e) {
    13351347                    Logging.warn(e);
    13361348                }
     
    16421654            return cbDontShowAgain.isSelected();
    16431655        }
    16441656    }
     1657
     1658    /**
     1659     * Remove deactivated plugins, returning true if JOSM should restart
     1660     *
     1661     * @param deactivatedPlugins
     1662     * @return true if there was a plugin that requires a restart
     1663     */
     1664    public static boolean removePlugins(List<PluginInformation> deactivatedPlugins) {
     1665        List<Destroyable> noRestart = deactivatedPlugins.parallelStream()
     1666                .map(info -> PluginHandler.getPlugin(info.name)).filter(Destroyable.class::isInstance)
     1667                .map(Destroyable.class::cast).collect(Collectors.toList());
     1668        noRestart.forEach(Destroyable::destroy);
     1669        return deactivatedPlugins.size() == noRestart.size();
     1670    }
    16451671}