1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.framework.util;
35
36 import info.magnolia.cms.core.FileSystemHelper;
37 import info.magnolia.ui.api.ioc.ViewScoped;
38 import info.magnolia.ui.framework.ioc.Destructible;
39
40 import java.io.File;
41 import java.io.IOException;
42 import java.util.HashSet;
43 import java.util.Set;
44
45 import javax.inject.Inject;
46
47 import org.apache.commons.io.FileUtils;
48 import org.apache.commons.io.FilenameUtils;
49 import org.apache.commons.lang3.StringUtils;
50
51
52
53
54
55 @ViewScoped
56 public class TempFilesManager implements Destructible {
57 private static final String FILENAME_PREFIX = "___";
58 private static final String SEPARATOR = ".";
59
60 private final Set<File> files = new HashSet<>();
61
62 private final FileSystemHelper fileSystemHelper;
63
64 @Inject
65 public TempFilesManager(FileSystemHelper fileSystemHelper) {
66 this.fileSystemHelper = fileSystemHelper;
67 }
68
69 public File createTempFile(String filename) throws IOException {
70 String prefix = expandShortFileNameToLengthThree(filename);
71 String suffix = SEPARATOR + FilenameUtils.getExtension(filename);
72
73 File tempFile = new TempFile(File.createTempFile(prefix, suffix, fileSystemHelper.getTempDirectory()).getPath());
74 tempFile.deleteOnExit();
75 register(tempFile);
76 return tempFile;
77 }
78
79
80
81
82
83
84
85 private String expandShortFileNameToLengthThree(String filename) {
86
87
88 return FILENAME_PREFIX + FilenameUtils.removeExtension(filename) + SEPARATOR;
89 }
90
91 public void register(File tempFile) {
92 files.add(tempFile);
93 }
94
95 public String toStandardFileName(String tempFileName) {
96 String extension = FilenameUtils.getExtension(tempFileName);
97 String fileName = FilenameUtils.removeExtension(tempFileName);
98 fileName = StringUtils.substringBeforeLast(fileName, SEPARATOR);
99 fileName = StringUtils.startsWith(fileName, FILENAME_PREFIX) ? StringUtils.substringAfter(fileName, FILENAME_PREFIX) : fileName;
100 return String.join(SEPARATOR, fileName, extension);
101 }
102
103 @Override
104 public void destroy() {
105 files.forEach(FileUtils::deleteQuietly);
106 }
107
108 private class TempFile extends File {
109 private String pathname;
110
111 private TempFile(String pathname) {
112 super(pathname);
113 this.pathname = pathname;
114 }
115
116 @Override
117 public String getName() {
118 return toStandardFileName(FilenameUtils.getName(pathname));
119 }
120 }
121
122 }