]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/FileExecutionResources.java
Make default execution ressources temp dir dependent of the JVM OS user, in order...
[gpl/argeo-slc.git] / runtime / org.argeo.slc.core / src / main / java / org / argeo / slc / core / execution / FileExecutionResources.java
index 0debe45fbd857da89c54fdf61c8f79b21935c4f4..37de20ef8d0289c6835b283b3cd256dac6be01a1 100644 (file)
@@ -1,3 +1,18 @@
+/*
+ * Copyright (C) 2007-2012 Mathieu Baudier
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.argeo.slc.core.execution;
 
 import java.io.File;
@@ -16,6 +31,7 @@ import org.springframework.core.io.FileSystemResource;
 import org.springframework.core.io.Resource;
 import org.springframework.util.Assert;
 
+/** Implements write access to resources based on standard Java {@link File} */
 public class FileExecutionResources implements ExecutionResources {
        private final static Log log = LogFactory
                        .getLog(FileExecutionResources.class);
@@ -23,9 +39,10 @@ public class FileExecutionResources implements ExecutionResources {
        public final static String DEFAULT_EXECUTION_RESOURCES_TMP_PATH = System
                        .getProperty("java.io.tmpdir")
                        + File.separator
-                       + "slc"
+                       + System.getProperty("user.name")
                        + File.separator
-                       + DEFAULT_EXECUTION_RESOURCES_DIRNAME;
+                       + "slc"
+                       + File.separator + DEFAULT_EXECUTION_RESOURCES_DIRNAME;
 
        private File baseDir;
        private ExecutionContext executionContext;
@@ -79,18 +96,33 @@ public class FileExecutionResources implements ExecutionResources {
                return resource;
        }
 
-       public String getAsOsPath(Resource resource, Boolean overwrite) {
-               File file = null;
+       public String getWritableOsPath(String relativePath) {
                try {
-                       file = resource.getFile();
-                       return file.getCanonicalPath();
+                       return getFile(relativePath).getCanonicalPath();
                } catch (IOException e) {
-                       if (log.isTraceEnabled())
-                               log
-                                               .trace("Resource "
-                                                               + resource
-                                                               + " is not available on the file system. Retrieving it...");
+                       throw new SlcException("Cannot find canonical path", e);
                }
+       }
+
+       public File getWritableOsFile(String relativePath) {
+               return getFile(relativePath);
+       }
+
+       public String getAsOsPath(Resource resource, Boolean overwrite) {
+               File file = fileFromResource(resource);
+               if (file != null)
+                       try {
+                               if (log.isTraceEnabled())
+                                       log.debug("Directly interpret " + resource + " as OS file "
+                                                       + file);
+                               return file.getCanonicalPath();
+                       } catch (IOException e1) {
+                               // silent
+                       }
+
+               if (log.isTraceEnabled())
+                       log.trace("Resource " + resource
+                                       + " is not available on the file system. Retrieving it...");
 
                InputStream in = null;
                OutputStream out = null;
@@ -116,24 +148,38 @@ public class FileExecutionResources implements ExecutionResources {
                }
        }
 
-       public File getFile(String relativePath) {
+       /**
+        * Extract the underlying file from the resource.
+        * 
+        * @return the file or null if no files support this resource.
+        */
+       protected File fileFromResource(Resource resource) {
+               try {
+                       return resource.getFile();
+               } catch (IOException e) {
+                       return null;
+               }
+
+       }
+
+       protected File getFile(String relativePath) {
+               File writableBaseDir = getWritableBaseDir();
+               return new File(writableBaseDir.getPath() + File.separator
+                               + relativePath.replace('/', File.separatorChar));
+       }
 
+       public File getWritableBaseDir() {
                if (withExecutionSubdirectory) {
                        Assert.notNull(executionContext, "execution context is null");
                        String path = baseDir.getPath()
                                        + File.separator
-                                       + sdf()
-                                                       .format(
-                                                                       executionContext
-                                                                                       .getVariable(ExecutionContext.VAR_EXECUTION_CONTEXT_CREATION_DATE))
+                                       + sdf().format(
+                                                       executionContext
+                                                                       .getVariable(ExecutionContext.VAR_EXECUTION_CONTEXT_CREATION_DATE))
                                        + executionContext.getUuid();
-                       File executionDir = new File(path);
-
-                       return new File(executionDir.getPath() + File.separator
-                                       + relativePath.replace('/', File.separatorChar));
+                       return new File(path);
                } else {
-                       return new File(baseDir.getPath() + File.separator
-                                       + relativePath.replace('/', File.separatorChar));
+                       return baseDir;
                }
        }