]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/FileExecutionResources.java
Move resource distribution
[gpl/argeo-slc.git] / runtime / org.argeo.slc.core / src / main / java / org / argeo / slc / core / execution / FileExecutionResources.java
1 package org.argeo.slc.core.execution;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.io.OutputStream;
8 import java.text.SimpleDateFormat;
9
10 import org.apache.commons.io.IOUtils;
11 import org.apache.commons.logging.Log;
12 import org.apache.commons.logging.LogFactory;
13 import org.argeo.slc.SlcException;
14 import org.argeo.slc.execution.ExecutionContext;
15 import org.springframework.core.io.FileSystemResource;
16 import org.springframework.core.io.Resource;
17 import org.springframework.util.Assert;
18
19 public class FileExecutionResources implements ExecutionResources {
20 private final static Log log = LogFactory
21 .getLog(FileExecutionResources.class);
22 protected final static String DEFAULT_EXECUTION_RESOURCES_DIRNAME = "executionResources";
23 public final static String DEFAULT_EXECUTION_RESOURCES_TMP_PATH = System
24 .getProperty("java.io.tmpdir")
25 + File.separator
26 + "slc"
27 + File.separator
28 + DEFAULT_EXECUTION_RESOURCES_DIRNAME;
29
30 private File baseDir;
31 private ExecutionContext executionContext;
32 private String prefixDatePattern = "yyyyMMdd_HHmmss_";
33 private SimpleDateFormat sdf = null;
34
35 private Boolean withExecutionSubdirectory = true;
36
37 public FileExecutionResources() {
38 // Default base directory
39 String osgiInstanceArea = System.getProperty("osgi.instance.area");
40 String osgiInstanceAreaDefault = System
41 .getProperty("osgi.instance.area.default");
42
43 if (osgiInstanceArea != null) {
44 // within OSGi with -data specified
45 osgiInstanceArea = removeFilePrefix(osgiInstanceArea);
46 baseDir = new File(osgiInstanceArea + File.separator
47 + DEFAULT_EXECUTION_RESOURCES_DIRNAME);
48 } else if (osgiInstanceAreaDefault != null) {
49 // within OSGi without -data specified
50 osgiInstanceAreaDefault = removeFilePrefix(osgiInstanceAreaDefault);
51 baseDir = new File(osgiInstanceAreaDefault + File.separator
52 + DEFAULT_EXECUTION_RESOURCES_DIRNAME);
53 } else {// outside OSGi
54 baseDir = new File(DEFAULT_EXECUTION_RESOURCES_TMP_PATH);
55 }
56 }
57
58 protected SimpleDateFormat sdf() {
59 // Lazy init in case prefix has been externally set
60 if (sdf == null)
61 sdf = new SimpleDateFormat(prefixDatePattern);
62 return sdf;
63 }
64
65 public Resource getWritableResource(String relativePath) {
66 File file = getFile(relativePath);
67 File parentDir = file.getParentFile();
68
69 if (!parentDir.exists()) {
70 // Creates if necessary
71 if (log.isTraceEnabled())
72 log.trace("Creating parent directory " + parentDir);
73 parentDir.mkdirs();
74 }
75 Resource resource = new FileSystemResource(file);
76
77 if (log.isTraceEnabled())
78 log.trace("Returns writable resource " + resource);
79 return resource;
80 }
81
82 public String getAsOsPath(Resource resource, Boolean overwrite) {
83 File file = null;
84 try {
85 file = resource.getFile();
86 return file.getCanonicalPath();
87 } catch (IOException e) {
88 if (log.isTraceEnabled())
89 log
90 .trace("Resource "
91 + resource
92 + " is not available on the file system. Retrieving it...");
93 }
94
95 InputStream in = null;
96 OutputStream out = null;
97 try {
98 String path = resource.getURL().getPath();
99 file = getFile(path);
100 if (file.exists() && !overwrite)
101 return file.getCanonicalPath();
102
103 file.getParentFile().mkdirs();
104 in = resource.getInputStream();
105 out = new FileOutputStream(file);
106 IOUtils.copy(in, out);
107 if (log.isDebugEnabled())
108 log.debug("Retrieved " + resource + " to OS file " + file);
109 return file.getCanonicalPath();
110 } catch (IOException e) {
111 throw new SlcException("Could not make resource " + resource
112 + " an OS file.", e);
113 } finally {
114 IOUtils.closeQuietly(in);
115 IOUtils.closeQuietly(out);
116 }
117 }
118
119 public File getFile(String relativePath) {
120
121 if (withExecutionSubdirectory) {
122 Assert.notNull(executionContext, "execution context is null");
123 String path = baseDir.getPath() + File.separator
124 + sdf().format(executionContext.getCreationDate())
125 + executionContext.getUuid();
126 File executionDir = new File(path);
127
128 return new File(executionDir.getPath() + File.separator
129 + relativePath.replace('/', File.separatorChar));
130 } else {
131 return new File(baseDir.getPath() + File.separator
132 + relativePath.replace('/', File.separatorChar));
133 }
134 }
135
136 protected String removeFilePrefix(String url) {
137 if (url.startsWith("file:"))
138 return url.substring("file:".length());
139 else if (url.startsWith("reference:file:"))
140 return url.substring("reference:file:".length());
141 else
142 return url;
143 }
144
145 public void setBaseDir(File baseDir) {
146 this.baseDir = baseDir;
147 }
148
149 public void setExecutionContext(ExecutionContext executionContext) {
150 this.executionContext = executionContext;
151 }
152
153 public void setPrefixDatePattern(String prefixDatePattern) {
154 this.prefixDatePattern = prefixDatePattern;
155 }
156
157 public File getBaseDir() {
158 return baseDir;
159 }
160
161 public ExecutionContext getExecutionContext() {
162 return executionContext;
163 }
164
165 public String getPrefixDatePattern() {
166 return prefixDatePattern;
167 }
168
169 /** Default is true. */
170 public void setWithExecutionSubdirectory(Boolean withExecutionSubdirectory) {
171 this.withExecutionSubdirectory = withExecutionSubdirectory;
172 }
173
174 }