From: Mathieu Baudier Date: Sun, 26 Jan 2014 12:18:10 +0000 (+0000) Subject: Introduce localScriptCopy X-Git-Tag: argeo-slc-2.1.7~270 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=e72b4b37a25b2ef348396eaa3fae6cc74560c44d;p=gpl%2Fargeo-slc.git Introduce localScriptCopy git-svn-id: https://svn.argeo.org/slc/trunk@6761 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/lib/linux/ScriptCall.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/lib/linux/ScriptCall.java index bd181b2af..d4f664add 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/lib/linux/ScriptCall.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/lib/linux/ScriptCall.java @@ -15,38 +15,93 @@ */ 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 scriptArgs = new ArrayList(); - 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; + } + }