package org.argeo.slc.core.execution;
import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.text.SimpleDateFormat;
+import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.argeo.slc.SlcException;
import org.argeo.slc.execution.ExecutionContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
private final static Log log = LogFactory
.getLog(FileExecutionResources.class);
protected final static String DEFAULT_EXECUTION_RESOURCES_DIRNAME = "executionResources";
+ public final static String DEFAULT_EXECUTION_RESOURCES_TMP_PATH = System
+ .getProperty("java.io.tmpdir")
+ + File.separator
+ + "slc"
+ + File.separator
+ + DEFAULT_EXECUTION_RESOURCES_DIRNAME;
private File baseDir;
private ExecutionContext executionContext;
private String prefixDatePattern = "yyyyMMdd_HHmmss_";
private SimpleDateFormat sdf = null;
+ private Boolean withExecutionSubdirectory = true;
+
public FileExecutionResources() {
// Default base directory
String osgiInstanceArea = System.getProperty("osgi.instance.area");
String osgiInstanceAreaDefault = System
.getProperty("osgi.instance.area.default");
- String tempDir = System.getProperty("java.io.tmpdir");
if (osgiInstanceArea != null) {
// within OSGi with -data specified
baseDir = new File(osgiInstanceAreaDefault + File.separator
+ DEFAULT_EXECUTION_RESOURCES_DIRNAME);
} else {// outside OSGi
- baseDir = new File(tempDir + File.separator + "slc"
- + File.separator + DEFAULT_EXECUTION_RESOURCES_DIRNAME);
+ baseDir = new File(DEFAULT_EXECUTION_RESOURCES_TMP_PATH);
}
}
public Resource getWritableResource(String relativePath) {
File file = getFile(relativePath);
File parentDir = file.getParentFile();
+
if (!parentDir.exists()) {
+ // Creates if necessary
if (log.isTraceEnabled())
log.trace("Creating parent directory " + parentDir);
parentDir.mkdirs();
}
Resource resource = new FileSystemResource(file);
+
if (log.isTraceEnabled())
log.trace("Returns writable resource " + resource);
return resource;
}
- public File getFile(String relativePath) {
- Assert.notNull(executionContext, "execution context is null");
-
- String path = baseDir.getPath() + File.separator
- + sdf().format(executionContext.getCreationDate())
- + executionContext.getUuid();
- File executionDir = new File(path);
+ public String getAsOsPath(Resource resource, Boolean overwrite) {
+ File file = null;
+ try {
+ file = resource.getFile();
+ return file.getCanonicalPath();
+ } catch (IOException e) {
+ if (log.isTraceEnabled())
+ log
+ .trace("Resource "
+ + resource
+ + " is not available on the file system. Retrieving it...");
+ }
- // Creates if necessary
- if (!executionDir.exists()) {
+ InputStream in = null;
+ OutputStream out = null;
+ try {
+ String path = resource.getURL().getPath();
+ file = getFile(path);
+ if (file.exists() && !overwrite)
+ return file.getCanonicalPath();
+
+ file.getParentFile().mkdirs();
+ in = resource.getInputStream();
+ out = new FileOutputStream(file);
+ IOUtils.copy(in, out);
if (log.isDebugEnabled())
- log.debug("Creating execution directory " + executionDir);
- executionDir.mkdirs();
+ log.debug("Retrieved " + resource + " to OS file " + file);
+ return file.getCanonicalPath();
+ } catch (IOException e) {
+ throw new SlcException("Could not make resource " + resource
+ + " an OS file.", e);
+ } finally {
+ IOUtils.closeQuietly(in);
+ IOUtils.closeQuietly(out);
}
+ }
+
+ public File getFile(String relativePath) {
- return new File(executionDir.getPath() + File.separator
- + relativePath.replace('/', File.separatorChar));
+ if (withExecutionSubdirectory) {
+ Assert.notNull(executionContext, "execution context is null");
+ String path = baseDir.getPath() + File.separator
+ + sdf().format(executionContext.getCreationDate())
+ + executionContext.getUuid();
+ File executionDir = new File(path);
+
+ return new File(executionDir.getPath() + File.separator
+ + relativePath.replace('/', File.separatorChar));
+ } else {
+ return new File(baseDir.getPath() + File.separator
+ + relativePath.replace('/', File.separatorChar));
+ }
}
protected String removeFilePrefix(String url) {
public String getPrefixDatePattern() {
return prefixDatePattern;
}
+
+ /** Default is true. */
+ public void setWithExecutionSubdirectory(Boolean withExecutionSubdirectory) {
+ this.withExecutionSubdirectory = withExecutionSubdirectory;
+ }
+
}