Ticket #19638: 19638.synchronized_collection.patch
| File 19638.synchronized_collection.patch, 10.1 KB (added by , 6 years ago) |
|---|
-
src/org/openstreetmap/josm/plugins/PluginHandler.java
277 277 /** 278 278 * All installed and loaded plugins (resp. their main classes) 279 279 */ 280 static final Collection<PluginProxy> pluginList = new LinkedList<>();280 static final Collection<PluginProxy> pluginList = Collections.synchronizedCollection(new LinkedList<>()); 281 281 282 282 /** 283 283 * All installed but not loaded plugins … … 322 322 * @since 10982 323 323 */ 324 324 public static List<PluginInformation> getPlugins() { 325 return pluginList.stream().map(PluginProxy::getPluginInformation) 326 .sorted(Comparator.comparing(PluginInformation::getName)).collect(Collectors.toList()); 325 synchronized (pluginList) { 326 return pluginList.stream().map(PluginProxy::getPluginInformation) 327 .sorted(Comparator.comparing(PluginInformation::getName)).collect(Collectors.toList()); 328 } 327 329 } 328 330 329 331 /** … … 598 600 MainApplication.worker.submit(() -> { 599 601 // Build list of plugins to download 600 602 Set<PluginInformation> toDownload = new HashSet<>(pluginInfoDownloadTask.getAvailablePlugins()); 601 toDownload.removeIf(info -> !missingRequiredPlugin.contains(info.getName())); 603 toDownload.removeIf(info -> !missingRequiredPlugin.contains(info.getName()) 604 && !missingRequiredPlugin.contains(info.provides) || !info.isForCurrentPlatform()); 605 // Remove duplicates 606 Set<String> possibleDuplicates = toDownload.parallelStream() 607 .collect(Collectors.groupingBy(i -> i.provides == null ? i.getName() : i.provides, Collectors.counting())) 608 .entrySet().stream().filter(e -> e.getValue() > 1).map(Map.Entry::getKey).collect(Collectors.toSet()); 609 toDownload.removeIf(i -> possibleDuplicates.contains(i.getName()) || possibleDuplicates.contains(i.provides)); 602 610 // Check if something has still to be downloaded 603 611 if (!toDownload.isEmpty()) { 604 612 // download plugins … … 692 700 693 701 // Add all plugins already loaded (to include early plugins when checking late ones) 694 702 Collection<PluginInformation> allPlugins = new HashSet<>(plugins); 695 for (PluginProxy proxy : pluginList) { 696 allPlugins.add(proxy.getPluginInformation()); 703 synchronized (pluginList) { 704 for (PluginProxy proxy : pluginList) { 705 allPlugins.add(proxy.getPluginInformation()); 706 } 697 707 } 698 708 699 709 // Include plugins that have been processed but not been loaded (for javafx plugin) … … 872 882 continue DEPENDENCIES; 873 883 } 874 884 } 875 for (PluginProxy proxy : pluginList) { 876 if (isDependency(proxy.getPluginInformation(), depName)) { 877 cl.addDependency(proxy.getClassLoader()); 878 continue DEPENDENCIES; 885 synchronized (pluginList) { 886 for (PluginProxy proxy : pluginList) { 887 if (isDependency(proxy.getPluginInformation(), depName)) { 888 cl.addDependency(proxy.getClassLoader()); 889 continue DEPENDENCIES; 890 } 879 891 } 880 892 } 881 893 Logging.error("unable to find dependency " + depName + " for plugin " + info.getName()); … … 1232 1244 * @return The plugin of the specified name, if installed and loaded, or {@code null} otherwise. 1233 1245 */ 1234 1246 public static Object getPlugin(String name) { 1235 for (PluginProxy plugin : pluginList) { 1236 if (plugin.getPluginInformation().name.equals(name)) 1237 return plugin.getPlugin(); 1247 synchronized (pluginList) { 1248 for (PluginProxy plugin : pluginList) { 1249 if (plugin.getPluginInformation().name.equals(name)) 1250 return plugin.getPlugin(); 1251 } 1238 1252 } 1239 1253 return null; 1240 1254 } … … 1247 1261 * @since 12323 1248 1262 */ 1249 1263 public static PluginClassLoader getPluginClassLoader(String name) { 1250 for (PluginProxy plugin : pluginList) { 1251 if (plugin.getPluginInformation().name.equals(name)) 1252 return plugin.getClassLoader(); 1264 synchronized (pluginList) { 1265 for (PluginProxy plugin : pluginList) { 1266 if (plugin.getPluginInformation().name.equals(name)) 1267 return plugin.getClassLoader(); 1268 } 1253 1269 } 1254 1270 return null; 1255 1271 } … … 1260 1276 * @param downloadSelections list of bounding box selectors 1261 1277 */ 1262 1278 public static void addDownloadSelection(List<DownloadSelection> downloadSelections) { 1263 for (PluginProxy p : pluginList) { 1264 p.addDownloadSelection(downloadSelections); 1279 synchronized (pluginList) { 1280 for (PluginProxy p : pluginList) { 1281 p.addDownloadSelection(downloadSelections); 1282 } 1265 1283 } 1266 1284 } 1267 1285 … … 1271 1289 */ 1272 1290 public static Collection<PreferenceSettingFactory> getPreferenceSetting() { 1273 1291 Collection<PreferenceSettingFactory> settings = new ArrayList<>(); 1274 for (PluginProxy plugin : pluginList) { 1275 settings.add(new PluginPreferenceFactory(plugin)); 1292 synchronized (pluginList) { 1293 for (PluginProxy plugin : pluginList) { 1294 settings.add(new PluginPreferenceFactory(plugin)); 1295 } 1276 1296 } 1277 1297 return settings; 1278 1298 } … … 1489 1509 1490 1510 // remember the error position, as multiple plugins may be involved, we search the topmost one 1491 1511 int pos = stack.size(); 1492 for (PluginProxy p : pluginList) { 1493 String baseClass = p.getPluginInformation().className; 1494 baseClass = baseClass.substring(0, baseClass.lastIndexOf('.')); 1495 for (int elpos = 0; elpos < pos; ++elpos) { 1496 if (stack.get(elpos).getClassName().startsWith(baseClass)) { 1497 pos = elpos; 1498 err = p; 1512 synchronized (pluginList) { 1513 for (PluginProxy p : pluginList) { 1514 String baseClass = p.getPluginInformation().className; 1515 baseClass = baseClass.substring(0, baseClass.lastIndexOf('.')); 1516 for (int elpos = 0; elpos < pos; ++elpos) { 1517 if (stack.get(elpos).getClassName().startsWith(baseClass)) { 1518 pos = elpos; 1519 err = p; 1520 } 1499 1521 } 1500 1522 } 1501 1523 } … … 1557 1579 */ 1558 1580 public static Collection<String> getBugReportInformation() { 1559 1581 final Collection<String> pl = new TreeSet<>(Config.getPref().getList("plugins", new LinkedList<>())); 1560 for (final PluginProxy pp : pluginList) { 1561 PluginInformation pi = pp.getPluginInformation(); 1562 pl.remove(pi.name); 1563 pl.add(pi.name + " (" + (pi.localversion != null && !pi.localversion.isEmpty() 1564 ? pi.localversion : "unknown") + ')'); 1582 synchronized (pluginList) { 1583 for (final PluginProxy pp : pluginList) { 1584 PluginInformation pi = pp.getPluginInformation(); 1585 pl.remove(pi.name); 1586 pl.add(pi.name + " (" + (pi.localversion != null && !pi.localversion.isEmpty() 1587 ? pi.localversion : "unknown") + ')'); 1588 } 1565 1589 } 1566 1590 return pl; 1567 1591 } -
src/org/openstreetmap/josm/plugins/PluginListParser.java
94 94 try { 95 95 if (name != null) { 96 96 PluginInformation info = createInfo(name, url, manifest); 97 for (PluginProxy plugin : PluginHandler.pluginList) { 98 if (plugin.getPluginInformation().name.equals(info.getName())) { 99 info.localversion = plugin.getPluginInformation().localversion; 97 synchronized (PluginHandler.pluginList) { 98 for (PluginProxy plugin : PluginHandler.pluginList) { 99 if (plugin.getPluginInformation().name.equals(info.getName())) { 100 info.localversion = plugin.getPluginInformation().localversion; 101 } 100 102 } 101 103 } 102 104 ret.add(info); -
src/org/openstreetmap/josm/plugins/ReadLocalPluginInformationTask.java
169 169 } 170 170 171 171 protected void analyseInProcessPlugins() { 172 for (PluginProxy proxy : PluginHandler.pluginList) { 173 PluginInformation info = proxy.getPluginInformation(); 174 if (canceled) return; 175 if (!availablePlugins.containsKey(info.name)) { 176 availablePlugins.put(info.name, info); 177 } else { 178 availablePlugins.get(info.name).localversion = info.localversion; 172 synchronized (PluginHandler.pluginList) { 173 for (PluginProxy proxy : PluginHandler.pluginList) { 174 PluginInformation info = proxy.getPluginInformation(); 175 if (canceled) return; 176 if (!availablePlugins.containsKey(info.name)) { 177 availablePlugins.put(info.name, info); 178 } else { 179 availablePlugins.get(info.name).localversion = info.localversion; 180 } 179 181 } 180 182 } 181 183 }
