package org.argeo.slc.cli;
import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Map;
import java.util.Properties;
-import java.util.StringTokenizer;
import java.util.UUID;
+import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.argeo.slc.ant.AntExecutionContext;
import org.argeo.slc.ant.AntSlcApplication;
-import org.argeo.slc.ant.SlcAntConstants;
-import org.argeo.slc.ant.SlcAntException;
+import org.argeo.slc.ant.AntConstants;
import org.argeo.slc.core.SlcException;
import org.argeo.slc.core.process.SlcExecution;
-import org.argeo.slc.runtime.SimpleSlcRuntime;
-import org.argeo.slc.runtime.SlcExecutionContext;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.BeanFactoryAware;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.GenericApplicationContext;
+import org.argeo.slc.runtime.SlcExecutionOutput;
+import org.argeo.slc.spring.SpringUtils;
+import org.springframework.core.io.DefaultResourceLoader;
+import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
-public class DefaultSlcRuntime extends SimpleSlcRuntime implements
- BeanFactoryAware {
+public class DefaultSlcRuntime {
private final static Log log = LogFactory.getLog(DefaultSlcRuntime.class);
public final static String SLC_ROOT_FILE_NAME = "slcRoot.properties";
- public SlcExecutionContext executeScript(Resource script,
- Properties properties, Map<String, Object> references) {
+ /**
+ * Simplified execution with default runtime, default target, and no
+ * properties/reference arguments.
+ *
+ * @param script
+ * path to the script
+ * @param executionOutput
+ * output
+ *
+ * @see #executeScript(String, String, String, Properties, Map,
+ * SlcExecutionOutput)
+ */
+ public void executeScript(String script,
+ SlcExecutionOutput<AntExecutionContext> executionOutput) {
+ executeScript(null, script, null, null, null, executionOutput);
+ }
+
+ /**
+ * Simplified execution with default runtime, and no properties/reference
+ * arguments.
+ *
+ * @param script
+ * path to the script
+ * @param targets
+ * comma separated list of targets
+ * @param executionOutput
+ * output
+ * @see #executeScript(String, String, String, Properties, Map,
+ * SlcExecutionOutput)
+ */
+ public void executeScript(String script, String targets,
+ SlcExecutionOutput<AntExecutionContext> executionOutput) {
+ executeScript(null, script, targets, null, null, executionOutput);
+ }
+
+ public void executeScript(String runtime, String script, String targets,
+ Properties properties, Map<String, Object> references,
+ SlcExecutionOutput<AntExecutionContext> executionOutput) {
+
+ Resource scriptRes = findScript(script);
+ Resource slcRootFile = findSlcRootFile(scriptRes);
- if (runtimeContext == null) {
- GenericApplicationContext ctx = new GenericApplicationContext();
- ctx.refresh();
- runtimeContext = ctx;
+ SlcExecution slcExecution = createSlcExecution(runtime, slcRootFile,
+ scriptRes, targets);
+
+ AntSlcApplication application = getApplication(slcRootFile);
+ application.execute(slcExecution, properties, references,
+ executionOutput);
+ }
+
+ protected Resource findScript(String scriptStr) {
+ Resource scriptRes;
+ if (new File(scriptStr).exists()) {
+ scriptRes = new FileSystemResource(scriptStr);
+ } else {
+ scriptRes = new DefaultResourceLoader(SlcMain.class
+ .getClassLoader()).getResource(scriptStr);
}
+ return scriptRes;
+ }
+ protected SlcExecution createSlcExecution(String runtimeStr,
+ Resource slcRootFile, Resource script, String targets) {
SlcExecution slcExecution = new SlcExecution();
slcExecution.setUuid(UUID.randomUUID().toString());
try {
slcExecution.setHost(SlcExecution.UNKOWN_HOST);
}
- slcExecution.setType(SlcAntConstants.EXECTYPE_SLC_ANT);
+ slcExecution.setType(AntConstants.EXECTYPE_SLC_ANT);
slcExecution.setUser(System.getProperty("user.name"));
- slcExecution.setStatus(SlcExecution.STATUS_RUNNING);
- try {
- slcExecution.getAttributes().put(SlcAntConstants.EXECATTR_ANT_FILE,
- script.getURL().toString());
- } catch (IOException e) {
- throw new SlcException("Cannot interpret script " + script
- + " as URL.", e);
- }
- AntSlcApplication application = new AntSlcApplication();
- prepareApplication(slcExecution, application, script);
- return application.execute(slcExecution, properties, references);
- }
+ if (runtimeStr != null)
+ slcExecution.getAttributes().put(AntConstants.EXECATTR_RUNTIME,
+ runtimeStr);
+ String scriptRelativePath = SpringUtils.extractRelativePath(SpringUtils
+ .getParent(slcRootFile), script);
+
+ slcExecution.getAttributes().put(AntConstants.EXECATTR_ANT_FILE,
+ scriptRelativePath);
+ if (targets != null)
+ slcExecution.getAttributes().put(
+ AntConstants.EXECATTR_ANT_TARGETS, targets);
- public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
- runtimeContext = (ApplicationContext) beanFactory;
+ slcExecution.setStatus(SlcExecution.STATUS_SCHEDULED);
+ return slcExecution;
}
- protected void prepareApplication(SlcExecution slcExecution,
- AntSlcApplication application, Resource script) {
+ protected AntSlcApplication getApplication(Resource slcRootFile) {
+ AntSlcApplication application = new AntSlcApplication();
+ InputStream inRootFile = null;
try {
- final String fileUrlPrefix = "";
-
- Resource slcRootFile = findSlcRootFile(script);
-
// Remove basedir property in order to avoid conflict with Maven
// if (all.containsKey("basedir"))
// all.remove("basedir");
- InputStream inRootFile = slcRootFile.getInputStream();
+ inRootFile = slcRootFile.getInputStream();
Properties rootProps = loadFile(inRootFile);
Resource confDir = null;
File workDir = null;
// Root dir
- final Resource rootDir = getParent(slcRootFile);
+ final Resource rootDir = SpringUtils.getParent(slcRootFile);
// Conf dir
String confDirStr = rootProps
- .getProperty(SlcAntConstants.CONF_DIR_PROPERTY);
+ .getProperty(AntConstants.CONF_DIR_PROPERTY);
if (confDirStr != null)
- confDir = runtimeContext.getResource(confDirStr);
+ confDir = new DefaultResourceLoader(application.getClass()
+ .getClassLoader()).getResource(confDirStr);
if (confDir == null || !confDir.exists()) {
// confDir = rootDir.createRelative("../conf");
- confDir = getParent(rootDir).createRelative("conf/");
+ confDir = SpringUtils.getParent(rootDir)
+ .createRelative("conf/");
}
// Work dir
String workDirStr = rootProps
- .getProperty(SlcAntConstants.WORK_DIR_PROPERTY);
+ .getProperty(AntConstants.WORK_DIR_PROPERTY);
if (workDirStr != null) {
workDir = new File(workDirStr);
}
} catch (IOException e) {
workDir = new File(System.getProperty("java.io.tmpdir")
+ File.separator + "slcExecutions" + File.separator
- + slcExecution.getUuid()).getCanonicalFile();
+ + slcRootFile.getURL().getPath());
log.debug("Root dir is not a file: " + e.getMessage()
+ ", creating work dir in temp: " + workDir);
}
+ workDir.mkdirs();
}
application.setConfDir(confDir);
application.setRootDir(rootDir);
application.setWorkDir(workDir);
- application.setSlcRuntime(this);
-
- application.init();
+ return application;
} catch (IOException e) {
throw new SlcException(
- "Could not prepare SLC application for SLC execution "
- + slcExecution.getUuid() + " and script " + script,
- e);
+ "Could not prepare SLC application for root file "
+ + slcRootFile, e);
+ } finally {
+ IOUtils.closeQuietly(inRootFile);
}
-
- // Properties from the conf dir files
- // Properties properties = new Properties();
- // StringTokenizer st = new StringTokenizer(rootProps.getProperty(
- // PROPERTY_FILE_NAMES_PROPERTY, "slc.properties"), ",");
- // while (st.hasMoreTokens()) {
- // String fileName = st.nextToken();
- // properties.putAll(loadFile(confDir.getAbsolutePath()
- // + File.separator + fileName));
- // }
- //
- // for (Object o : properties.keySet()) {
- // String key = o.toString();
- // if (all.getProperty(key) == null) {// not already set
- // all.setProperty(key, properties.getProperty(key));
- // }
- // }
- //
}
/**
if (currPath.equals("/") || currPath.equals("")) {
return null;
} else {
- return findSlcRootFile(getParent(currDir));
+ return findSlcRootFile(SpringUtils.getParent(currDir));
}
- // int indx = currPath.lastIndexOf('/',currPath.length()-1);
-
}
} catch (IOException e) {
throw new SlcException("Problem when looking in SLC root file in "
+ currDir, e);
}
-
- // for (File file : dir.listFiles()) {
- // if (!file.isDirectory()
- // && file.getName().equals(SLC_ROOT_FILE_NAME)) {
- // return file;
- // }
- // }
- //
- // File parentDir = dir.getParentFile();
- // if (parentDir == null) {
- // return null;// stop condition: not found
- // } else {
- // return findSlcRootFile(parentDir);
- // }
}
/** Loads the content of a file as <code>Properties</code>. */
try {
p.load(in);
} catch (IOException e) {
- throw new SlcAntException("Cannot read SLC root file", e);
+ throw new SlcException("Cannot read SLC root file", e);
}
return p;
}
-
- private Resource getParent(Resource res) {
- try {
- if (res.getURL().getPath().equals("/"))
- return null;
-
- String urlStr = res.getURL().toString();
- if (urlStr.charAt(urlStr.length() - 1) == '/')
- urlStr = urlStr.substring(0, urlStr.length() - 2);
-
- String parentUrlStr = urlStr.substring(0, urlStr.lastIndexOf('/'));
- return runtimeContext.getResource(parentUrlStr + '/');
- } catch (IOException e) {
- throw new SlcException("Cannot get parent for resource " + res, e);
- }
- }
-
- // private Resource getParentOfFile(Resource file) {
- // try {
- // return file.createRelative(".");
- // } catch (IOException e) {
- // throw new SlcException("Cannot get parent for resource " + file, e);
- // }
- // }
}