]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/FileExecutionResources.java
Modular distributions
[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()
124 + File.separator
125 + sdf()
126 .format(
127 executionContext
128 .getVariable(ExecutionContext.VAR_EXECUTION_CONTEXT_CREATION_DATE))
129 + executionContext.getUuid();
130 File executionDir = new File(path);
131
132 return new File(executionDir.getPath() + File.separator
133 + relativePath.replace('/', File.separatorChar));
134 } else {
135 return new File(baseDir.getPath() + File.separator
136 + relativePath.replace('/', File.separatorChar));
137 }
138 }
139
140 protected String removeFilePrefix(String url) {
141 if (url.startsWith("file:"))
142 return url.substring("file:".length());
143 else if (url.startsWith("reference:file:"))
144 return url.substring("reference:file:".length());
145 else
146 return url;
147 }
148
149 public void setBaseDir(File baseDir) {
150 this.baseDir = baseDir;
151 }
152
153 public void setExecutionContext(ExecutionContext executionContext) {
154 this.executionContext = executionContext;
155 }
156
157 public void setPrefixDatePattern(String prefixDatePattern) {
158 this.prefixDatePattern = prefixDatePattern;
159 }
160
161 public File getBaseDir() {
162 return baseDir;
163 }
164
165 public ExecutionContext getExecutionContext() {
166 return executionContext;
167 }
168
169 public String getPrefixDatePattern() {
170 return prefixDatePattern;
171 }
172
173 /** Default is true. */
174 public void setWithExecutionSubdirectory(Boolean withExecutionSubdirectory) {
175 this.withExecutionSubdirectory = withExecutionSubdirectory;
176 }
177
178 }