|
39 | 39 | import ru.olegcherednik.zip4jvm.utils.function.Writer;
|
40 | 40 |
|
41 | 41 | import lombok.extern.slf4j.Slf4j;
|
| 42 | +import org.apache.commons.lang3.StringUtils; |
42 | 43 |
|
43 | 44 | import java.io.IOException;
|
44 | 45 | import java.nio.file.Files;
|
@@ -74,44 +75,64 @@ public ZipEngine(Path zip, ZipSettings settings) throws IOException {
|
74 | 75 | }
|
75 | 76 |
|
76 | 77 | @Override
|
77 |
| - public void add(Path path, String name) { |
| 78 | + public void add(Path path) { |
| 79 | + add(path, PathUtils.getName(path), ""); |
| 80 | + } |
| 81 | + |
| 82 | + @Override |
| 83 | + public void addWithRename(Path path, String name) { |
| 84 | + add(path, name, ""); |
| 85 | + } |
| 86 | + |
| 87 | + @Override |
| 88 | + public void addWithMove(Path path, String dir) { |
| 89 | + add(path, PathUtils.getName(path), dir); |
| 90 | + } |
| 91 | + |
| 92 | + private void add(Path path, String name, String dir) { |
78 | 93 | if (!Files.exists(path))
|
79 | 94 | return;
|
80 | 95 |
|
81 | 96 | if (Files.isSymbolicLink(path))
|
82 | 97 | path = ZipSymlinkEngine.getSymlinkTarget(path);
|
83 | 98 |
|
84 |
| - if (Files.isDirectory(path)) |
85 |
| - zipSymlinkEngine.list(getDirectoryNamedPaths(path, name)).stream() |
86 |
| - .map(namedPath -> { |
87 |
| - String entryName = namedPath.getEntryName(); |
88 |
| - ZipEntrySettings entrySettings = getEntrySettings(entryName); |
89 |
| - return namedPath.createZipEntry(entrySettings); |
90 |
| - }) |
91 |
| - .forEach(this::add); |
92 |
| - else if (Files.isRegularFile(path)) { |
93 |
| - ZipEntrySettings entrySettings = getEntrySettings(name); |
94 |
| - ZipEntry zipEntry = ZipEntryBuilder.regularFile(path, name, entrySettings); |
95 |
| - add(zipEntry); |
96 |
| - } else |
97 |
| - log.warn("Unknown path type '{}'; ignore it", path); |
| 99 | + for (NamedPath namedPath : getNamedPaths(path, name, dir)) { |
| 100 | + String entryName = namedPath.getEntryName(); |
| 101 | + ZipEntrySettings entrySettings = settings.getEntrySettings(entryName); |
| 102 | + add(namedPath.createZipEntry(entrySettings)); |
| 103 | + } |
98 | 104 | }
|
99 | 105 |
|
100 |
| - private ZipEntrySettings getEntrySettings(String entryName) { |
101 |
| - return settings.getEntrySettingsProvider().apply(entryName); |
| 106 | + private List<NamedPath> getNamedPaths(Path path, String name, String dir) { |
| 107 | + if (Files.isDirectory(path)) |
| 108 | + return zipSymlinkEngine.list(getDirectoryNamedPaths(path, name, dir)); |
| 109 | + |
| 110 | + if (Files.isRegularFile(path)) { |
| 111 | + if (StringUtils.isNotBlank(dir)) |
| 112 | + name = dir + '/' + name; |
| 113 | + |
| 114 | + return Collections.singletonList(NamedPath.create(path, name)); |
| 115 | + } |
| 116 | + |
| 117 | + log.warn("Unknown path type '{}'; ignore it", path); |
| 118 | + return Collections.emptyList(); |
102 | 119 | }
|
103 | 120 |
|
104 |
| - private List<NamedPath> getDirectoryNamedPaths(Path path, String name) { |
105 |
| - return settings.isRemoveRootDir() ? PathUtils.list(path).stream() |
106 |
| - .map(NamedPath::create) |
107 |
| - .sorted(NamedPath.SORT_BY_NAME_ASC) |
108 |
| - .collect(Collectors.toList()) |
109 |
| - : Collections.singletonList(NamedPath.create(path, name)); |
| 121 | + private List<NamedPath> getDirectoryNamedPaths(Path path, String name, String dir) { |
| 122 | + if (settings.isRemoveRootDir()) |
| 123 | + return PathUtils.list(path).stream() |
| 124 | + .map(p -> StringUtils.isNotBlank(dir) |
| 125 | + ? NamedPath.create(p, dir + '/' + PathUtils.getName(p)) |
| 126 | + : NamedPath.create(p)) |
| 127 | + .sorted(NamedPath.SORT_BY_NAME_ASC) |
| 128 | + .collect(Collectors.toList()); |
| 129 | + |
| 130 | + return Collections.singletonList(NamedPath.create(path, name)); |
110 | 131 | }
|
111 | 132 |
|
112 | 133 | @Override
|
113 | 134 | public void add(ZipFile.Entry entry) {
|
114 |
| - ZipEntrySettings entrySettings = settings.getEntrySettingsProvider().apply(entry.getName()); |
| 135 | + ZipEntrySettings entrySettings = settings.getEntrySettings(entry.getName()); |
115 | 136 | ZipEntry zipEntry = ZipEntryBuilder.build(entry, entrySettings);
|
116 | 137 | add(zipEntry);
|
117 | 138 | }
|
@@ -164,7 +185,7 @@ public void copy(Path zip) throws IOException {
|
164 | 185 | if (fileNameWriter.containsKey(fileName))
|
165 | 186 | throw new EntryDuplicationException(fileName);
|
166 | 187 |
|
167 |
| - char[] password = settings.getEntrySettingsProvider().apply(fileName).getPassword(); |
| 188 | + char[] password = settings.getEntrySettings(fileName).getPassword(); |
168 | 189 | fileNameWriter.put(fileName, new ExistedEntryWriter(srcZipModel, fileName, tempZipModel, password));
|
169 | 190 | }
|
170 | 191 | }
|
@@ -224,7 +245,7 @@ private static ZipModel createTempZipModel(Path zip, ZipSettings settings, Map<S
|
224 | 245 | tempZipModel.setZip64(zipModel.isZip64());
|
225 | 246 |
|
226 | 247 | zipModel.getEntryNames().forEach(entryName -> {
|
227 |
| - char[] password = settings.getEntrySettingsProvider().apply(entryName).getPassword(); |
| 248 | + char[] password = settings.getEntrySettings(entryName).getPassword(); |
228 | 249 | fileNameWriter.put(entryName, new ExistedEntryWriter(zipModel, entryName, tempZipModel, password));
|
229 | 250 | });
|
230 | 251 | }
|
|
0 commit comments