import java.util.StringTokenizer;
import java.util.Vector;
+import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tools.ant.Project;
import org.argeo.slc.core.structure.StructureRegistry;
import org.argeo.slc.core.structure.tree.TreeSPath;
import org.argeo.slc.core.structure.tree.TreeSRegistry;
+import org.argeo.slc.logging.Log4jUtils;
import org.argeo.slc.runtime.SlcExecutionContext;
+import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.Resource;
+import org.springframework.util.SystemPropertyUtils;
public class AntSlcApplication {
+ private final static String DEFAULT_APP_LOG4J_PROPERTIES = "org/argeo/slc/ant/defaultAppLog4j.properties";
+
private final static Log log = LogFactory.getLog(AntSlcApplication.class);
private Resource contextLocation;
public SlcExecutionContext execute(SlcExecution slcExecution,
Properties properties, Map<String, Object> references) {
+
+ // Properties and app logging initialization
+ initSystemProperties(properties);
+ Log4jUtils.initLog4j("classpath:" + DEFAULT_APP_LOG4J_PROPERTIES);
+
log.info("### Start SLC execution " + slcExecution.getUuid() + " ###");
if (log.isDebugEnabled()) {
log.debug("rootDir=" + rootDir);
log.debug("workDir=" + workDir);
}
+ // Spring initialization
+ ConfigurableApplicationContext ctx = createExecutionContext();
+
// Ant coordinates
Resource script = findAntScript(slcExecution);
List<String> targets = findAntTargets(slcExecution);
-
- ConfigurableApplicationContext ctx = createExecutionContext(properties);
-
+
+ // Ant project initialization
Project project = new Project();
AntExecutionContext executionContext = new AntExecutionContext(project);
project.addReference(SlcAntConstants.REF_ROOT_CONTEXT, ctx);
return targets;
}
- protected ConfigurableApplicationContext createExecutionContext(
- Properties userProperties) {
+ protected void initSystemProperties(Properties userProperties) {
// Set user properties as system properties so that Spring can access
// them
-
if (userProperties != null) {
for (Object key : userProperties.keySet()) {
System.setProperty(key.toString(), userProperties
.getURL().toString());
if (workDir != null)
System.setProperty(SlcAntConstants.WORK_DIR_PROPERTY, workDir
- .toString());
+ .getCanonicalPath());
+
+ // Additional properties in slc.properties file. Already set sytem
+ // properties (such as the various directories) can be resolved in
+ // placeholders.
+ if (confDir != null) {
+ Resource slcPropertiesRes = confDir
+ .createRelative("slc.properties");
+ if (slcPropertiesRes.exists()) {
+ Properties slcProperties = new Properties();
+ InputStream in = slcPropertiesRes.getInputStream();
+ try {
+ slcProperties.load(in);
+ } finally {
+ IOUtils.closeQuietly(in);
+ }
+
+ for (String key : slcProperties.stringPropertyNames()) {
+ if (!System.getProperties().containsKey(key)) {
+ String value = SystemPropertyUtils
+ .resolvePlaceholders(slcProperties
+ .getProperty(key));
+ System.setProperty(key, value);
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ throw new SlcAntException("Cannot init system properties.", e);
+ }
+ }
+ protected ConfigurableApplicationContext createExecutionContext() {
+ try {
if (confDir != null && contextLocation == null) {
contextLocation = confDir
.createRelative("applicationContext.xml");
ctx);
xmlReader.loadBeanDefinitions(contextLocation);
}
+
+ // Add property place holder
+ PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
+ ppc.setIgnoreUnresolvablePlaceholders(true);
+ ctx.addBeanFactoryPostProcessor(ppc);
+
ctx.refresh();
return ctx;
} catch (Exception 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));
- // }
- // }
- //
}
/**
} else {
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>. */
}
return p;
}
-
- // private Resource getParentOfFile(Resource file) {
- // try {
- // return file.createRelative(".");
- // } catch (IOException e) {
- // throw new SlcException("Cannot get parent for resource " + file, e);
- // }
- // }
}
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.argeo.slc.core.SlcException;
+import org.argeo.slc.logging.Log4jUtils;
import org.springframework.core.io.FileSystemResource;
public class SlcMain {
single, agent
}
- public final static String MODE_SINGLE = "single";
- public final static String MODE_AGENT = "agent";
+ private static Log log = null;
+
+ private final static String BOOTSTRAP_LOG4J_CONFIG = "org/argeo/slc/cli/bootstrapLog4j.properties";
private final static Option modeOpt = OptionBuilder.withLongOpt("mode")
.withArgName("mode").hasArg().isRequired().withDescription(
File script = null;
try {
+
CommandLineParser clParser = new GnuParser();
CommandLine cl = clParser.parse(options, args);
} catch (IllegalArgumentException e) {
throw new SlcException("Unrecognized mode '" + modeStr + "'", e);
}
- System.out.println("Mode: " + mode);
// Script
if (mode.equals(Mode.single)) {
+ "'");
script = (File) cl.getOptionObject(scriptOpt.getOpt());
}
- System.out.println("Script: " + script.getAbsolutePath());
// Properties
if (cl.hasOption(propertyOpt.getOpt())) {
addProperty(properties, property);
}
}
- System.out.print("Properties: " + properties);
+
} catch (ParseException e) {
System.err.println("Problem with command line arguments. "
+ e.getMessage());
- printUsage();
+ badExit();
} catch (SlcException e) {
System.err.println(e.getMessage());
- printUsage();
+ badExit();
+ } catch (Exception e) {
+ System.err.println("Unexpected exception when bootstrapping.");
+ e.printStackTrace();
+ badExit();
+ }
+
+ // Initializes logging and log arguments
+ initLogging(properties);
+ if (log.isDebugEnabled()) {
+ log.debug("Mode: " + mode);
+ log.debug("User properties: " + properties);
+ if (script != null)
+ log.debug("Script: " + script.getAbsolutePath());
}
// Execution
}
}
+
+ private static void initLogging(Properties userProperties) {
+ // Add log4j user properties to System properties
+ for (String key : userProperties.stringPropertyNames()) {
+ if (key.startsWith("log4j.")) {
+ System.setProperty(key, userProperties.getProperty(key));
+ }
+ }
+
+ System.setProperty("log4j.defaultInitOverride", "true");
+ Log4jUtils.initLog4j(System.getProperty("log4j.configuration",
+ "classpath:" + BOOTSTRAP_LOG4J_CONFIG));
+ log = LogFactory.getLog(SlcMain.class);
+
+ }
+
+ private static void badExit() {
+ printUsage();
+ System.exit(1);
+ }
}
--- /dev/null
+log4j.rootLogger=WARN, console, file
+
+## Levels
+log4j.logger.org.argeo=INFO
+
+## Appenders
+# console uses PatternLayout.
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c%n
+
+# file uses PatternLayout
+log4j.appender.file=org.apache.log4j.RollingFileAppender
+log4j.appender.file.File=${slc.workDir}/log/slcApp.log
+log4j.appender.file.MaxFileSize=1MB
+log4j.appender.file.MaxBackupIndex=5
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c%n
+++ /dev/null
-<?xml version="1.0"?>\r
-\r
-<mapping>\r
- <description>Mapping of generic types</description>\r
-\r
- <class name="java.lang.Exception" auto-complete="false">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="message" type="string" set-method="%1"\r
- get-method="getMessage">\r
- <bind-xml node="attribute" />\r
- </field>\r
- <field name="stackTrace" collection="array"\r
- type="java.lang.StackTraceElement">\r
- <bind-xml auto-naming="deriveByClass"\r
- location="stack-trace" />\r
- </field>\r
- </class>\r
-\r
- <class name="java.lang.StackTraceElement" auto-complete="false"\r
- verify-constructable="false">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="declaringClass" type="string" set-method="%1"\r
- get-method="getClassName">\r
- <bind-xml node="attribute" />\r
- </field>\r
- <field name="methodName" type="string" set-method="%2"\r
- get-method="getMethodName">\r
- <bind-xml node="attribute" />\r
- </field>\r
- <field name="fileName" type="string" set-method="%3"\r
- get-method="getFileName">\r
- <bind-xml node="attribute" />\r
- </field>\r
- <field name="lineNumber" type="integer" set-method="%4"\r
- get-method="getLineNumber">\r
- <bind-xml node="attribute" />\r
- </field>\r
- </class>\r
-</mapping>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0"?>\r
-\r
-<mapping>\r
- <description>Message objects XML mapping</description>\r
-\r
- <!-- TESTS -->\r
- <class\r
- name="org.argeo.slc.msg.test.tree.CreateTreeTestResultRequest">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="treeTestResult"\r
- type="org.argeo.slc.core.test.tree.TreeTestResult" />\r
- </class>\r
-\r
- <class\r
- name="org.argeo.slc.msg.test.tree.CloseTreeTestResultRequest">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="resultUuid" />\r
- <field name="closeDate" />\r
- </class>\r
-\r
- <class name="org.argeo.slc.msg.test.tree.ResultPartRequest">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="resultUuid" />\r
- <field name="resultPart"\r
- type="org.argeo.slc.core.test.SimpleResultPart">\r
- <bind-xml auto-naming="deriveByClass" />\r
- </field>\r
-\r
- <field name="relatedElements" collection="map">\r
- <bind-xml name="element" location="related-elements">\r
- <class name="org.exolab.castor.mapping.MapItem">\r
- <map-to\r
- ns-uri="http://argeo.org/projects/slc/schemas" ns-prefix="slc" />\r
- <field name="key"\r
- type="org.argeo.slc.core.structure.tree.TreeSPath"\r
- handler="org.argeo.slc.castor.structure.tree.TreeSPathFieldHandler">\r
- <bind-xml name="path" node="attribute" />\r
- </field>\r
- <field name="value"\r
- type="org.argeo.slc.core.structure.SimpleSElement">\r
- <bind-xml auto-naming="deriveByClass" />\r
- </field>\r
- </class>\r
- </bind-xml>\r
- </field>\r
- <field name="path">\r
- <bind-xml auto-naming="deriveByClass" />\r
- </field>\r
- <field name="testRunDescriptor" />\r
- </class>\r
-\r
-\r
- <!-- PROCESS -->\r
- <class name="org.argeo.slc.msg.process.SlcExecutionStepsRequest">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="slcExecutionUuid" />\r
- <field name="steps" collection="vector"\r
- type="org.argeo.slc.core.process.SlcExecutionStep">\r
- <bind-xml auto-naming="deriveByClass" location="steps" />\r
- </field>\r
- </class>\r
-\r
- <class name="org.argeo.slc.msg.process.SlcExecutionStatusRequest">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="slcExecutionUuid" />\r
- <field name="newStatus"/>\r
- </class>\r
-\r
- <class name="org.argeo.slc.msg.process.SlcExecutionRequest">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="slcExecution"\r
- type="org.argeo.slc.core.process.SlcExecution" />\r
- </class>\r
-\r
-\r
-</mapping>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0"?>\r
-\r
-<!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" "http://castor.org/mapping.dtd">\r
-\r
-<mapping>\r
- <description>Process objects XML mapping</description>\r
-\r
- <class name="org.argeo.slc.core.process.SlcExecution">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="uuid" identity="true">\r
- <bind-xml node="attribute" />\r
- </field>\r
- <field name="status" />\r
- <field name="type" />\r
- <field name="host" />\r
- <field name="user" />\r
- <field name="steps" collection="vector"\r
- type="org.argeo.slc.core.process.SlcExecutionStep">\r
- <bind-xml auto-naming="deriveByClass" location="steps" />\r
- </field>\r
- <field name="attributes" collection="map">\r
- <bind-xml name="attribute" location="attributes">\r
- <class name="org.exolab.castor.mapping.MapItem">\r
- <map-to\r
- ns-uri="http://argeo.org/projects/slc/schemas" ns-prefix="slc" />\r
- <field name="key" type="string">\r
- <bind-xml name="name" node="attribute" />\r
- </field>\r
- <field name="value" type="string">\r
- <bind-xml node="text" />\r
- </field>\r
- </class>\r
- </bind-xml>\r
- </field>\r
- </class>\r
-\r
- <class name="org.argeo.slc.core.process.SlcExecutionStep">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="uuid" identity="true">\r
- <bind-xml node="attribute" />\r
- </field>\r
- <field name="type" />\r
- <field name="begin" />\r
- <field name="logLines" collection="vector" type="string">\r
- <bind-xml name="log-line" location="log-lines" />\r
- </field>\r
- </class>\r
- \r
-</mapping>
\ No newline at end of file
+++ /dev/null
-<beans xmlns="http://www.springframework.org/schema/beans"\r
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"\r
- default-lazy-init="true">\r
-\r
- <bean id="slcDefault.castor.marshaller"\r
- class="org.springframework.oxm.castor.CastorMarshaller">\r
- <property name="mappingLocations">\r
- <list>\r
- <value>\r
- classpath:org/argeo/slc/castor/msg/mapping.xml\r
- </value>\r
- <value>\r
- classpath:org/argeo/slc/castor/process/mapping.xml\r
- </value>\r
- <value>\r
- classpath:org/argeo/slc/castor/structure/mapping.xml\r
- </value>\r
- <value>\r
- classpath:org/argeo/slc/castor/test/mapping.xml\r
- </value>\r
- </list>\r
- </property>\r
- <property name="whitespacePreserve" value="true" />\r
- </bean>\r
-\r
- <bean id="slcDefault.castor.xsltReportGenerator"\r
- class="org.argeo.slc.core.test.tree.XsltReportGenerator"\r
- init-method="init">\r
- <property name="xsltStyleSheet"\r
- value="classpath:/org/argeo/slc/core/test/tree/basicReport.xslt" />\r
- <property name="marshaller" ref="slcDefault.castor.marshaller" />\r
- <property name="logXml" value="false" />\r
- <!-- \r
- <property name="outputDir" value="D:\dev\test\SLC\SlcReports" />\r
- -->\r
- </bean>\r
-\r
-\r
-</beans>\r
+++ /dev/null
-<?xml version="1.0"?>\r
-\r
-<mapping>\r
- <description>Structure related objects XML mapping</description>\r
-\r
- <class name="org.argeo.slc.core.structure.tree.TreeSPath"\r
- auto-complete="false">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="asUniqueString" type="string">\r
- <bind-xml node="attribute" />\r
- </field>\r
- </class>\r
-\r
- <class name="org.argeo.slc.core.structure.SimpleSElement"\r
- auto-complete="false">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="label" type="string" />\r
- <field name="tags" collection="map">\r
- <bind-xml name="tag" location="tags">\r
- <class name="org.exolab.castor.mapping.MapItem">\r
- <map-to\r
- ns-uri="http://argeo.org/projects/slc/schemas" ns-prefix="slc" />\r
- <field name="key" type="string">\r
- <bind-xml name="name" node="attribute" />\r
- </field>\r
- <field name="value" type="string">\r
- <bind-xml name="tag-value" />\r
- </field>\r
- </class>\r
- </bind-xml>\r
- </field>\r
- </class>\r
-</mapping>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0"?>\r
-\r
-<mapping>\r
- <description>Test objects XML mapping</description>\r
-\r
- <class name="org.argeo.slc.core.test.TestRunDescriptor"\r
- auto-complete="false">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="testRunUuid" />\r
- <field name="slcExecutionUuid" />\r
- <field name="slcExecutionStepUuid" />\r
- <field name="testResultUuid" />\r
- <field name="deployedSytemId" />\r
- </class>\r
-\r
- <class name="org.argeo.slc.core.test.tree.TreeTestResult"\r
- auto-complete="false">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="uuid" type="string">\r
- <bind-xml name="uuid" node="attribute" />\r
- </field>\r
- <field name="closeDate" />\r
- <field name="resultParts" collection="map">\r
- <bind-xml name="result-part" location="result-parts">\r
- <class name="org.exolab.castor.mapping.MapItem">\r
- <map-to\r
- ns-uri="http://argeo.org/projects/slc/schemas" ns-prefix="slc" />\r
- <field name="key"\r
- type="org.argeo.slc.core.structure.tree.TreeSPath"\r
- handler="org.argeo.slc.castor.structure.tree.TreeSPathFieldHandler">\r
- <bind-xml name="path" node="attribute" />\r
- </field>\r
- <field name="value"\r
- type="org.argeo.slc.core.test.tree.PartSubList">\r
- <bind-xml name="part-sub-list" />\r
- </field>\r
- </class>\r
- </bind-xml>\r
- </field>\r
- <field name="elements" collection="map">\r
- <bind-xml name="element" location="elements">\r
- <class name="org.exolab.castor.mapping.MapItem">\r
- <map-to\r
- ns-uri="http://argeo.org/projects/slc/schemas" ns-prefix="slc" />\r
- <field name="key"\r
- type="org.argeo.slc.core.structure.tree.TreeSPath"\r
- handler="org.argeo.slc.castor.structure.tree.TreeSPathFieldHandler">\r
- <bind-xml name="path" node="attribute" />\r
- </field>\r
- <field name="value"\r
- type="org.argeo.slc.core.structure.SimpleSElement">\r
- <bind-xml auto-naming="deriveByClass" />\r
- </field>\r
- </class>\r
- </bind-xml>\r
- </field>\r
- </class>\r
-\r
- <class name="org.argeo.slc.core.test.tree.PartSubList"\r
- auto-complete="false">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="parts" collection="arraylist"\r
- type="org.argeo.slc.core.test.SimpleResultPart">\r
- <bind-xml auto-naming="deriveByClass" location="parts" />\r
- </field>\r
- </class>\r
-\r
- <class name="org.argeo.slc.core.test.SimpleResultPart"\r
- auto-complete="false">\r
- <map-to ns-uri="http://argeo.org/projects/slc/schemas"\r
- ns-prefix="slc" />\r
- <field name="testRunUuid" type="string" />\r
- <field name="message" type="string"/>\r
- <field name="status" type="string"\r
- handler="org.argeo.slc.castor.test.tree.StatusFieldHandler" />\r
- <field name="exceptionMessage" type="string"/>\r
- </class>\r
-\r
-</mapping>
\ No newline at end of file
--- /dev/null
+log4j.rootLogger=WARN, console\r
+\r
+## Levels\r
+log4j.logger.org.argeo=INFO\r
+\r
+## Appenders\r
+# console is set to be a ConsoleAppender.\r
+log4j.appender.console=org.apache.log4j.ConsoleAppender\r
+\r
+# console uses PatternLayout.\r
+log4j.appender.console.layout=org.apache.log4j.PatternLayout\r
+log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c%n\r
+\r
# Set root logger level to DEBUG and its only appender to A1.\r
-log4j.rootLogger=INFO, console\r
+log4j.rootLogger=WARN, console\r
\r
## Levels\r
# Slc\r
log4j.logger.org.exolab.castor=WARN\r
\r
# Spring\r
-log4j.logger.org.springframework=INFO\r
-# Hibernate\r
-log4j.logger.org.hibernate=WARN\r
-#log4j.logger.org.hibernate.SQL=TRACE\r
-#log4j.logger.org.hibernate.tool.hbm2ddl=TRACE\r
-#log4j.logger.org.hibernate.type=TRACE\r
-\r
+log4j.logger.org.springframework=WARN\r
\r
## Appenders\r
# A1 is set to be a ConsoleAppender.\r