From: Mathieu Baudier Date: Sat, 21 Jun 2008 11:59:25 +0000 (+0000) Subject: Restructure example X-Git-Tag: argeo-slc-2.1.7~2782 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=c64c55c639fa256f85d498d958f78dfd0d6f10c6;p=gpl%2Fargeo-slc.git Restructure example Improve logging git-svn-id: https://svn.argeo.org/slc/trunk@1260 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.slc.agent/src/main/java/org/argeo/slc/ant/AntSlcApplication.java b/org.argeo.slc.agent/src/main/java/org/argeo/slc/ant/AntSlcApplication.java index b312ad84a..a63e56d66 100644 --- a/org.argeo.slc.agent/src/main/java/org/argeo/slc/ant/AntSlcApplication.java +++ b/org.argeo.slc.agent/src/main/java/org/argeo/slc/ant/AntSlcApplication.java @@ -9,6 +9,7 @@ import java.util.Properties; 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; @@ -20,14 +21,19 @@ import org.argeo.slc.core.structure.SimpleSElement; 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; @@ -39,6 +45,11 @@ public class AntSlcApplication { public SlcExecutionContext execute(SlcExecution slcExecution, Properties properties, Map 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); @@ -46,12 +57,14 @@ public class AntSlcApplication { log.debug("workDir=" + workDir); } + // Spring initialization + ConfigurableApplicationContext ctx = createExecutionContext(); + // Ant coordinates Resource script = findAntScript(slcExecution); List 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); @@ -93,11 +106,9 @@ public class AntSlcApplication { 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 @@ -119,8 +130,40 @@ public class AntSlcApplication { .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"); @@ -133,6 +176,12 @@ public class AntSlcApplication { 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) { 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 74b383eef..ea046bb13 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 @@ -121,24 +121,6 @@ public class DefaultSlcRuntime { } 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)); - // } - // } - // } /** @@ -160,27 +142,11 @@ public class DefaultSlcRuntime { } 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 Properties. */ @@ -193,12 +159,4 @@ public class DefaultSlcRuntime { } return p; } - - // private Resource getParentOfFile(Resource file) { - // try { - // return file.createRelative("."); - // } catch (IOException e) { - // throw new SlcException("Cannot get parent for resource " + file, e); - // } - // } } diff --git a/org.argeo.slc.agent/src/main/java/org/argeo/slc/cli/SlcMain.java b/org.argeo.slc.agent/src/main/java/org/argeo/slc/cli/SlcMain.java index 821e0f679..39ff6aa41 100644 --- a/org.argeo.slc.agent/src/main/java/org/argeo/slc/cli/SlcMain.java +++ b/org.argeo.slc.agent/src/main/java/org/argeo/slc/cli/SlcMain.java @@ -11,7 +11,10 @@ import org.apache.commons.cli.Option; 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 { @@ -19,8 +22,9 @@ 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( @@ -53,6 +57,7 @@ public class SlcMain { File script = null; try { + CommandLineParser clParser = new GnuParser(); CommandLine cl = clParser.parse(options, args); @@ -63,7 +68,6 @@ public class SlcMain { } catch (IllegalArgumentException e) { throw new SlcException("Unrecognized mode '" + modeStr + "'", e); } - System.out.println("Mode: " + mode); // Script if (mode.equals(Mode.single)) { @@ -73,7 +77,6 @@ public class SlcMain { + "'"); script = (File) cl.getOptionObject(scriptOpt.getOpt()); } - System.out.println("Script: " + script.getAbsolutePath()); // Properties if (cl.hasOption(propertyOpt.getOpt())) { @@ -81,14 +84,27 @@ public class SlcMain { 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 @@ -128,4 +144,24 @@ public class SlcMain { } } + + 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); + } } diff --git a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/ant/defaultAppLog4j.properties b/org.argeo.slc.agent/src/main/resources/org/argeo/slc/ant/defaultAppLog4j.properties new file mode 100644 index 000000000..3803c75d0 --- /dev/null +++ b/org.argeo.slc.agent/src/main/resources/org/argeo/slc/ant/defaultAppLog4j.properties @@ -0,0 +1,18 @@ +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 diff --git a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/mapping.xml b/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/mapping.xml deleted file mode 100644 index 92c2c71d0..000000000 --- a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/mapping.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - Mapping of generic types - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/msg/mapping.xml b/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/msg/mapping.xml deleted file mode 100644 index f695f9573..000000000 --- a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/msg/mapping.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - Message objects XML mapping - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/process/mapping.xml b/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/process/mapping.xml deleted file mode 100644 index 1b5b2ec95..000000000 --- a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/process/mapping.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - Process objects XML mapping - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/spring/applicationContext.xml b/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/spring/applicationContext.xml deleted file mode 100644 index 068d773fb..000000000 --- a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/spring/applicationContext.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - classpath:org/argeo/slc/castor/msg/mapping.xml - - - classpath:org/argeo/slc/castor/process/mapping.xml - - - classpath:org/argeo/slc/castor/structure/mapping.xml - - - classpath:org/argeo/slc/castor/test/mapping.xml - - - - - - - - - - - - - - - diff --git a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/structure/mapping.xml b/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/structure/mapping.xml deleted file mode 100644 index 3e20025b3..000000000 --- a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/structure/mapping.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - Structure related objects XML mapping - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/test/mapping.xml b/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/test/mapping.xml deleted file mode 100644 index adfea8a9d..000000000 --- a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/castor/test/mapping.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - Test objects XML mapping - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.argeo.slc.agent/src/main/resources/org/argeo/slc/cli/bootstrapLog4j.properties b/org.argeo.slc.agent/src/main/resources/org/argeo/slc/cli/bootstrapLog4j.properties new file mode 100644 index 000000000..7dcc3fd59 --- /dev/null +++ b/org.argeo.slc.agent/src/main/resources/org/argeo/slc/cli/bootstrapLog4j.properties @@ -0,0 +1,13 @@ +log4j.rootLogger=WARN, console + +## Levels +log4j.logger.org.argeo=INFO + +## Appenders +# console is set to be a ConsoleAppender. +log4j.appender.console=org.apache.log4j.ConsoleAppender + +# console uses PatternLayout. +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c%n + diff --git a/org.argeo.slc.agent/src/test/resources/log4j.properties b/org.argeo.slc.agent/src/test/resources/log4j.properties index 605a28c48..a583c59fa 100644 --- a/org.argeo.slc.agent/src/test/resources/log4j.properties +++ b/org.argeo.slc.agent/src/test/resources/log4j.properties @@ -1,5 +1,5 @@ # Set root logger level to DEBUG and its only appender to A1. -log4j.rootLogger=INFO, console +log4j.rootLogger=WARN, console ## Levels # Slc @@ -9,13 +9,7 @@ log4j.logger.org.argeo=DEBUG log4j.logger.org.exolab.castor=WARN # Spring -log4j.logger.org.springframework=INFO -# Hibernate -log4j.logger.org.hibernate=WARN -#log4j.logger.org.hibernate.SQL=TRACE -#log4j.logger.org.hibernate.tool.hbm2ddl=TRACE -#log4j.logger.org.hibernate.type=TRACE - +log4j.logger.org.springframework=WARN ## Appenders # A1 is set to be a ConsoleAppender.