X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.agent%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fcli%2FDefaultSlcRuntime.java;h=3fc2a5671fced3e77bb54b9fb7c290e84d5a6607;hb=fa38c56c899d3f7347d960c4684fa293b1502c6c;hp=15aca3d86f57ebea423b7d8789e261d958a2a19a;hpb=48d35a213a2b0d792b11b5df276158159105043b;p=gpl%2Fargeo-slc.git diff --git a/org.argeo.slc.agent/src/main/java/org/argeo/slc/cli/DefaultSlcRuntime.java b/org.argeo.slc.agent/src/main/java/org/argeo/slc/cli/DefaultSlcRuntime.java index 15aca3d86..3fc2a5671 100644 --- a/org.argeo.slc.agent/src/main/java/org/argeo/slc/cli/DefaultSlcRuntime.java +++ b/org.argeo.slc.agent/src/main/java/org/argeo/slc/cli/DefaultSlcRuntime.java @@ -1,44 +1,96 @@ 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 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 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 executionOutput) { + executeScript(null, script, targets, null, null, executionOutput); + } + + public void executeScript(String runtime, String script, String targets, + Properties properties, Map references, + SlcExecutionOutput executionOutput) { + + Resource scriptRes = findScript(script); + Resource slcRootFile = findSlcRootFile(scriptRes); - if (runtimeContext == null) - runtimeContext = new GenericApplicationContext(); + 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 { @@ -47,54 +99,58 @@ public class DefaultSlcRuntime extends SimpleSlcRuntime implements 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); - slcExecution.getAttributes().put(SlcAntConstants.EXECATTR_ANT_FILE, - script.toString()); - 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 = getParentOfFile(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 = 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); } @@ -107,41 +163,25 @@ public class DefaultSlcRuntime extends SimpleSlcRuntime implements } 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); + + 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)); - // } - // } - // } /** @@ -161,29 +201,13 @@ public class DefaultSlcRuntime extends SimpleSlcRuntime implements if (currPath.equals("/") || currPath.equals("")) { return null; } else { - return findSlcRootFile(getParentOfDir(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 Properties. */ @@ -192,24 +216,8 @@ public class DefaultSlcRuntime extends SimpleSlcRuntime implements 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 getParentOfDir(Resource dir) { - try { - return dir.createRelative(".."); - } catch (IOException e) { - throw new SlcException("Cannot get parent for resource " + dir, e); - } - } - - private Resource getParentOfFile(Resource file) { - try { - return file.createRelative("."); - } catch (IOException e) { - throw new SlcException("Cannot get parent for resource " + file, e); - } - } }