Changeset 15508 in josm for trunk/src


Ignore:
Timestamp:
2019-11-04T22:19:54+01:00 (6 years ago)
Author:
Don-vip
Message:

fix #18277 - Allow plugins to implement Destroyable if they want to allow restartless updates/removals (patch by taylor.smock)

Location:
trunk/src/org/openstreetmap/josm
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java

    r15121 r15508  
    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;
     
    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)
  • trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java

    r15505 r15508  
    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;
     
    11691170                        tr("Update plugins")
    11701171                );
    1171 
    11721172                try {
    11731173                    pluginDownloadTask.run();
     
    13331333                    pluginsToLoad.stream().filter(x -> x.libraries.contains(oldPluginURL)).forEach(
    13341334                            x -> Collections.replaceAll(x.libraries, oldPluginURL, newPluginURL));
     1335
     1336                    // Attempt to update loaded plugin (must implement Destroyable)
     1337                    PluginInformation tInfo = pluginsToLoad.parallelStream()
     1338                            .filter(x -> x.libraries.contains(newPluginURL)).findAny().orElse(null);
     1339                    if (tInfo != null) {
     1340                        Object tUpdatedPlugin = getPlugin(tInfo.name);
     1341                        if (tUpdatedPlugin instanceof Destroyable) {
     1342                            ((Destroyable) tUpdatedPlugin).destroy();
     1343                            PluginHandler.loadPlugins(getInfoPanel(), Collections.singleton(tInfo),
     1344                                    NullProgressMonitor.INSTANCE);
     1345                        }
     1346                    }
    13351347                } catch (MalformedURLException e) {
    13361348                    Logging.warn(e);
     
    16441656        }
    16451657    }
     1658
     1659    /**
     1660     * Remove deactivated plugins, returning true if JOSM should restart
     1661     *
     1662     * @param deactivatedPlugins The plugins to deactivate
     1663     *
     1664     * @return true if there was a plugin that requires a restart
     1665     * @since 15508
     1666     */
     1667    public static boolean removePlugins(List<PluginInformation> deactivatedPlugins) {
     1668        List<Destroyable> noRestart = deactivatedPlugins.parallelStream()
     1669                .map(info -> PluginHandler.getPlugin(info.name)).filter(Destroyable.class::isInstance)
     1670                .map(Destroyable.class::cast).collect(Collectors.toList());
     1671        boolean restartNeeded;
     1672        try {
     1673            noRestart.forEach(Destroyable::destroy);
     1674            new ArrayList<>(pluginList).stream().filter(proxy -> noRestart.contains(proxy.getPlugin()))
     1675                    .forEach(pluginList::remove);
     1676            restartNeeded = deactivatedPlugins.size() != noRestart.size();
     1677        } catch (Exception e) {
     1678            Logging.error(e);
     1679            restartNeeded = true;
     1680        }
     1681        return restartNeeded;
     1682    }
    16461683}
Note: See TracChangeset for help on using the changeset viewer.