|
10 | 10 |
|
11 | 11 | package org.junit.platform.launcher.core; |
12 | 12 |
|
13 | | -import static java.util.Collections.unmodifiableSet; |
14 | | - |
15 | 13 | import java.io.IOException; |
16 | 14 | import java.nio.file.Files; |
17 | 15 | import java.nio.file.Path; |
18 | 16 | import java.nio.file.Paths; |
19 | | -import java.util.Arrays; |
20 | | -import java.util.HashSet; |
21 | 17 | import java.util.List; |
22 | | -import java.util.Set; |
23 | 18 | import java.util.function.Supplier; |
| 19 | +import java.util.regex.Pattern; |
24 | 20 |
|
25 | 21 | import org.junit.platform.engine.TestDescriptor; |
26 | 22 | import org.junit.platform.engine.UniqueId.Segment; |
27 | 23 | import org.junit.platform.engine.reporting.OutputDirectoryProvider; |
28 | 24 |
|
| 25 | +/** |
| 26 | + * Hierarchical {@link OutputDirectoryProvider} that creates directories based on |
| 27 | + * the unique ID segments of a {@link TestDescriptor}. |
| 28 | + * |
| 29 | + * @since 1.12 |
| 30 | + */ |
29 | 31 | class HierarchicalOutputDirectoryProvider implements OutputDirectoryProvider { |
30 | 32 |
|
31 | | - private static final Set<Character> FORBIDDEN_CHARS = unmodifiableSet( |
32 | | - new HashSet<>(Arrays.asList('\0', '/', '\\', ':', '*', '?', '"', '<', '>', '|'))); |
33 | | - private static final char REPLACEMENT = '_'; |
| 33 | + private static final Pattern FORBIDDEN_CHARS = Pattern.compile("[^a-z0-9.,_\\-() ]", Pattern.CASE_INSENSITIVE); |
| 34 | + private static final String REPLACEMENT = "_"; |
34 | 35 |
|
35 | 36 | private final Supplier<Path> rootDirSupplier; |
36 | 37 | private volatile Path rootDir; |
@@ -62,15 +63,6 @@ private static Path toSanitizedPath(Segment segment) { |
62 | 63 | } |
63 | 64 |
|
64 | 65 | private static String sanitizeName(String value) { |
65 | | - StringBuilder result = new StringBuilder(value.length()); |
66 | | - for (int i = 0; i < value.length(); i++) { |
67 | | - char c = value.charAt(i); |
68 | | - result.append(isForbiddenCharacter(c) ? REPLACEMENT : c); |
69 | | - } |
70 | | - return result.toString(); |
71 | | - } |
72 | | - |
73 | | - private static boolean isForbiddenCharacter(char c) { |
74 | | - return FORBIDDEN_CHARS.contains(c) || Character.isISOControl(c); |
| 66 | + return FORBIDDEN_CHARS.matcher(value).replaceAll(REPLACEMENT); |
75 | 67 | } |
76 | 68 | } |
0 commit comments