|
30 | 30 | import com.google.common.collect.LinkedListMultimap; |
31 | 31 | import com.google.common.collect.ListMultimap; |
32 | 32 | import com.google.common.collect.Maps; |
| 33 | +import com.google.common.collect.Multimaps; |
33 | 34 | import com.google.common.collect.SetMultimap; |
34 | 35 | import com.google.common.collect.Sets; |
35 | 36 | import com.google.common.io.CharStreams; |
@@ -287,7 +288,8 @@ private void processLdml() { |
287 | 288 | Map<IcuLocaleDir, DependencyGraph> graphMetadata = new HashMap<>(); |
288 | 289 | splitDirs.forEach(d -> graphMetadata.put(d, new DependencyGraph(cldrVersion))); |
289 | 290 |
|
290 | | - SetMultimap<IcuLocaleDir, String> writtenLocaleIds = HashMultimap.create(); |
| 291 | + SetMultimap<IcuLocaleDir, String> writtenLocaleIds = |
| 292 | + Multimaps.synchronizedSetMultimap(HashMultimap.create()); |
291 | 293 | Path baseDir = config.getOutputDir(); |
292 | 294 |
|
293 | 295 | System.out.println("processing standard ldml files"); |
@@ -650,7 +652,12 @@ private Path createDirectory(Path dir) { |
650 | 652 | try { |
651 | 653 | Files.createDirectories(dir); |
652 | 654 | } catch (IOException e) { |
653 | | - throw new RuntimeException("cannot create directory: " + dir, e); |
| 655 | + // On Windows, concurrent directory creation by parallel threads can transiently |
| 656 | + // produce AccessDeniedException even when the directory already exists. If the |
| 657 | + // directory is now present (created by another thread), treat it as success. |
| 658 | + if (!Files.isDirectory(dir)) { |
| 659 | + throw new RuntimeException("cannot create directory: " + dir, e); |
| 660 | + } |
654 | 661 | } |
655 | 662 | return dir; |
656 | 663 | } |
|
0 commit comments