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 @Override
62 public void extract() throws IOException {
63 final InputStream resourceStream = checkInput();
64 final File checkedTargetFile = checkOutput();
65 if (checkedTargetFile != null) {
66 final OutputStream out = openOutput(checkedTargetFile);
67
68 copyAndClose(resourceStream, out);
69 }
70 }
71
72 protected InputStream checkInput() throws IOException {
73 final InputStream resourceStream = ClasspathResourcesUtil.getStream(resourcePath, false);
74 if (resourceStream == null) {
75 throw new IOException("Can't open " + resourcePath);
76 }
77 return resourceStream;
78 }
79
80
81
82
83
84 protected File checkOutput() throws IOException {
85 final File targetFile = new File(absoluteTargetPath);
86 final File parent = targetFile.getParentFile();
87 if (!parent.exists() && !parent.mkdirs()) {
88 throw new IOException("Can't create directories for " + targetFile.getAbsolutePath());
89 } else if (!parent.canWrite()) {
90 throw new IOException("Can't write to " + targetFile.getAbsolutePath());
91 }
92 return targetFile;
93 }
94
95 protected OutputStream openOutput(File targetFile) throws IOException {
96 return new FileOutputStream(targetFile);
97 }
98
99 protected void copyAndClose(InputStream in, OutputStream out) throws IOException {
100 try {
101 IOUtils.copy(in, out);
102 } finally {
103 IOUtils.closeQuietly(in);
104 IOUtils.closeQuietly(out);
105 }
106 }
107 }