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.module.files;
35
36 import info.magnolia.cms.util.ClasspathResourcesUtil;
37 import org.apache.commons.io.IOUtils;
38
39 import java.io.File;
40 import java.io.FileOutputStream;
41 import java.io.IOException;
42 import java.io.InputStream;
43 import java.io.OutputStream;
44
45
46
47
48
49
50
51
52 public class BasicFileExtractorOperation implements FileExtractorOperation {
53 protected final String resourcePath;
54 protected final String absoluteTargetPath;
55
56 BasicFileExtractorOperation(String resourcePath, String absoluteTargetPath) {
57 this.resourcePath = resourcePath;
58 this.absoluteTargetPath = absoluteTargetPath;
59 }
60
61 public void extract() throws IOException {
62 final InputStream resourceStream = checkInput();
63 final File checkedTargetFile = checkOutput();
64 if (checkedTargetFile != null) {
65 final OutputStream out = openOutput(checkedTargetFile);
66
67 copyAndClose(resourceStream, out);
68 }
69 }
70
71 protected InputStream checkInput() throws IOException {
72 final InputStream resourceStream = ClasspathResourcesUtil.getStream(resourcePath, false);
73 if (resourceStream == null) {
74 throw new IOException("Can't open " + resourcePath);
75 }
76 return resourceStream;
77 }
78
79
80
81
82
83 protected File checkOutput() throws IOException {
84 final File targetFile = new File(absoluteTargetPath);
85 final File parent = targetFile.getParentFile();
86 if (!parent.exists() && !parent.mkdirs()) {
87 throw new IOException("Can't create directories for " + targetFile.getAbsolutePath());
88 } else if (!parent.canWrite()) {
89 throw new IOException("Can't write to " + targetFile.getAbsolutePath());
90 }
91 return targetFile;
92 }
93
94 protected OutputStream openOutput(File targetFile) throws IOException {
95 return new FileOutputStream(targetFile);
96 }
97
98 protected void copyAndClose(InputStream in, OutputStream out) throws IOException {
99 try {
100 IOUtils.copy(in, out);
101 } finally {
102 IOUtils.closeQuietly(in);
103 IOUtils.closeQuietly(out);
104 }
105 }
106 }