Ticket #18277: 18277.3.patch
| File 18277.3.patch, 7.0 KB (added by , 6 years ago) |
|---|
-
src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java
55 55 import org.openstreetmap.josm.gui.util.GuiHelper; 56 56 import org.openstreetmap.josm.gui.widgets.FilterField; 57 57 import org.openstreetmap.josm.plugins.PluginDownloadTask; 58 import org.openstreetmap.josm.plugins.PluginHandler; 58 59 import org.openstreetmap.josm.plugins.PluginInformation; 59 60 import org.openstreetmap.josm.plugins.ReadLocalPluginInformationTask; 60 61 import org.openstreetmap.josm.plugins.ReadRemotePluginInformationTask; … … 324 325 List<String> l = new LinkedList<>(model.getSelectedPluginNames()); 325 326 Collections.sort(l); 326 327 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 } 329 334 for (PluginInformation pi : model.getNewlyActivatedPlugins()) { 330 335 if (!pi.canloadatruntime) 331 336 return true; -
src/org/openstreetmap/josm/plugins/PluginHandler.java
68 68 import org.openstreetmap.josm.io.OfflineAccessException; 69 69 import org.openstreetmap.josm.io.OnlineResource; 70 70 import org.openstreetmap.josm.spi.preferences.Config; 71 import org.openstreetmap.josm.tools.Destroyable; 71 72 import org.openstreetmap.josm.tools.GBC; 72 73 import org.openstreetmap.josm.tools.I18n; 73 74 import org.openstreetmap.josm.tools.ImageProvider; … … 1167 1168 pluginsToDownload, 1168 1169 tr("Update plugins") 1169 1170 ); 1170 1171 1171 try { 1172 1172 pluginDownloadTask.run(); 1173 1173 } catch (RuntimeException e) { // NOPMD … … 1331 1331 URL oldPluginURL = updatedPlugin.toURI().toURL(); 1332 1332 pluginsToLoad.stream().filter(x -> x.libraries.contains(oldPluginURL)).forEach( 1333 1333 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 } 1334 1346 } catch (MalformedURLException e) { 1335 1347 Logging.warn(e); 1336 1348 } … … 1642 1654 return cbDontShowAgain.isSelected(); 1643 1655 } 1644 1656 } 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 boolean restartNeeded; 1669 try { 1670 noRestart.forEach(Destroyable::destroy); 1671 restartNeeded = deactivatedPlugins.size() != noRestart.size(); 1672 } catch (Exception e) { 1673 Logging.error(e); 1674 restartNeeded = true; 1675 } 1676 return restartNeeded; 1677 } 1645 1678 } -
test/unit/org/openstreetmap/josm/plugins/PluginHandlerTestIT.java
13 13 import java.util.Iterator; 14 14 import java.util.List; 15 15 import java.util.Map; 16 import java.util.Optional; 16 17 import java.util.Set; 17 18 import java.util.function.Consumer; 18 19 import java.util.stream.Collectors; … … 30 31 import org.openstreetmap.josm.gui.progress.NullProgressMonitor; 31 32 import org.openstreetmap.josm.spi.preferences.Config; 32 33 import org.openstreetmap.josm.testutils.JOSMTestRules; 34 import org.openstreetmap.josm.tools.Destroyable; 33 35 import org.openstreetmap.josm.tools.Utils; 34 36 35 37 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; … … 74 76 testPlugin(MainApplication.getLayerManager()::removeLayer, layer, layerExceptions, loadedPlugins); 75 77 } 76 78 79 testCompletelyRestartlessPlugins(loadedPlugins); 80 77 81 debugPrint(invalidManifestEntries); 78 82 debugPrint(loadingExceptions); 79 83 debugPrint(layerExceptions); … … 83 87 assertTrue(msg, invalidManifestEntries.isEmpty() && loadingExceptions.isEmpty() && layerExceptions.isEmpty()); 84 88 } 85 89 90 private static void testCompletelyRestartlessPlugins(List<PluginInformation> loadedPlugins) { 91 List<PluginInformation> restartable = loadedPlugins.parallelStream() 92 .filter(info -> PluginHandler.getPlugin(info.name) instanceof Destroyable).collect(Collectors.toList()); 93 // ensure good plugin behavior with regards to Destroyable 94 for (int i = 0; i < 2; i++) { 95 assertFalse(PluginHandler.removePlugins(restartable)); 96 Optional<PluginInformation> optional = restartable.stream() 97 .filter(info -> PluginHandler.getPlugins().contains(info)).findAny(); 98 assertTrue(restartable.stream().noneMatch(info -> PluginHandler.getPlugins().contains(info))); 99 PluginHandler.loadEarlyPlugins(null, restartable, null); 100 PluginHandler.loadLatePlugins(null, restartable, null); 101 } 102 103 assertTrue(PluginHandler.removePlugins(loadedPlugins)); 104 assertTrue(restartable.parallelStream().noneMatch(info -> PluginHandler.getPlugins().contains(info))); 105 } 106 86 107 private static void debugPrint(Map<String, ?> invalidManifestEntries) { 87 108 System.out.println(invalidManifestEntries.entrySet() 88 109 .stream()
