Ticket #18277: 18277.patch

File 18277.patch, 4.2 KB (added by taylor.smock, 5 years ago)

Initial implementation (no tests)

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

     
    2222import java.util.List;
    2323import java.util.Set;
    2424import java.util.regex.Pattern;
     25import java.util.stream.Collectors;
    2526
    2627import javax.swing.AbstractAction;
    2728import javax.swing.BorderFactory;
     
    5556import org.openstreetmap.josm.gui.util.GuiHelper;
    5657import org.openstreetmap.josm.gui.widgets.FilterField;
    5758import org.openstreetmap.josm.plugins.PluginDownloadTask;
     59import org.openstreetmap.josm.plugins.PluginHandler;
    5860import org.openstreetmap.josm.plugins.PluginInformation;
    5961import org.openstreetmap.josm.plugins.ReadLocalPluginInformationTask;
    6062import org.openstreetmap.josm.plugins.ReadRemotePluginInformationTask;
    6163import org.openstreetmap.josm.spi.preferences.Config;
     64import org.openstreetmap.josm.tools.Destroyable;
    6265import org.openstreetmap.josm.tools.GBC;
    6366import org.openstreetmap.josm.tools.ImageProvider;
    6467import org.openstreetmap.josm.tools.Logging;
     
    324327            List<String> l = new LinkedList<>(model.getSelectedPluginNames());
    325328            Collections.sort(l);
    326329            Config.getPref().putList("plugins", l);
    327             if (!model.getNewlyDeactivatedPlugins().isEmpty())
     330            List<PluginInformation> deactivatedPlugins = model.getNewlyDeactivatedPlugins();
     331            if (!deactivatedPlugins.isEmpty()) {
     332                List<Destroyable> noRestart = deactivatedPlugins.parallelStream()
     333                        .map(info -> PluginHandler.getPlugin(info.name)).filter(Destroyable.class::isInstance)
     334                        .map(Destroyable.class::cast).collect(Collectors.toList());
     335                noRestart.forEach(Destroyable::destroy);
     336                // return true under the assumption that things will work better, even if
     337                // everything was "Destroyable"
    328338                return true;
     339            }
    329340            for (PluginInformation pi : model.getNewlyActivatedPlugins()) {
    330341                if (!pi.canloadatruntime)
    331342                    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                }