Introduce localScriptCopy
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 26 Jan 2014 12:18:10 +0000 (12:18 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 26 Jan 2014 12:18:10 +0000 (12:18 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@6761 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/lib/linux/ScriptCall.java

index bd181b2af06d2135da30493ad84d4011037cfe9c..d4f664add309b937d6d4a54f2fdc584c4cb50160 100644 (file)
  */
 package org.argeo.slc.lib.linux;
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.core.execution.tasks.SystemCall;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.core.io.Resource;
 
+/** Call to the interpreter of a script language. */
 public class ScriptCall extends SystemCall implements InitializingBean {
        private Resource script;
        private List<Object> scriptArgs = new ArrayList<Object>();
 
-       public void afterPropertiesSet() throws Exception {
+       private Boolean localScriptCopy = false;
+
+       /** For use in Spring. */
+       public ScriptCall() {
+               super();
+       }
+
+       /** For use in code ({@link #init()} is called). */
+       public ScriptCall(Resource script) {
+               this.script = script;
+               init();
+       }
+
+       public void init() {
                initInterpreter();
                for (Object obj : scriptArgs) {
                        arg(obj.toString());
                }
-               setStdInFile(script);
+       }
+
+       public void afterPropertiesSet() throws Exception {
+               init();
        }
 
        protected void initInterpreter() {
                String ext = FilenameUtils.getExtension(script.getFilename());
-               if ("sh".equals(ext))
-                       arg("/bin/sh").arg("-s");
-               else if ("pl".equals(ext))
-                       arg("/usr/bin/perl").arg("/dev/stdin");
-               else if ("py".equals(ext))
-                       arg("/usr/bin/python").arg("-");
-               else
-                       throw new SlcException("Cannot initialize script intepreter for "
-                                       + script);
+
+               if (localScriptCopy) {
+                       File scriptFile = copyScript();
+                       if ("sh".equals(ext))
+                               arg("/bin/sh").arg(scriptFile.getAbsolutePath());
+                       else if ("pl".equals(ext))
+                               arg("/usr/bin/perl").arg(scriptFile.getAbsolutePath());
+                       else if ("py".equals(ext))
+                               arg("/usr/bin/python").arg(scriptFile.getAbsolutePath());
+                       else
+                               throw new SlcException(
+                                               "Cannot initialize script intepreter for " + script);
+               } else {
+                       setStdInFile(script);
+                       if ("sh".equals(ext))
+                               arg("/bin/sh").arg("-s");
+                       else if ("pl".equals(ext))
+                               arg("/usr/bin/perl").arg("/dev/stdin");
+                       else if ("py".equals(ext))
+                               arg("/usr/bin/python").arg("-");
+                       else
+                               throw new SlcException(
+                                               "Cannot initialize script intepreter for " + script);
+               }
+       }
+
+       private File copyScript() {
+               InputStream in = null;
+               OutputStream out = null;
+               try {
+                       File scriptFile = File.createTempFile("script", ".sh");
+                       scriptFile.deleteOnExit();
+                       in = script.getInputStream();
+                       out = new FileOutputStream(scriptFile);
+                       IOUtils.copy(in, out);
+                       return scriptFile;
+               } catch (Exception e) {
+                       throw new SlcException("Cannot copy " + script, e);
+               } finally {
+                       IOUtils.closeQuietly(in);
+                       IOUtils.closeQuietly(out);
+               }
        }
 
        public void setScript(Resource script) {
@@ -57,4 +112,8 @@ public class ScriptCall extends SystemCall implements InitializingBean {
                this.scriptArgs = scriptArgs;
        }
 
+       public void setLocalScriptCopy(Boolean localScriptCopy) {
+               this.localScriptCopy = localScriptCopy;
+       }
+
 }