neeme 2004/05/06 04:00:44 Modified: fortress/bean/src/java/org/apache/avalon/fortress/tools FortressBean.java Log: changes: * added back the possibility to redirect commons logging output to avalon logger, if libraries are available. uses reflection, no hard dependencies * made it possible to run this class from command line, most of parameters are then passed in through system properties - now it is easier to run fortress with ant <java> task TODO: * add javadocs to document the command line functionality Revision Changes Path 1.7 +88 -6 avalon-excalibur/fortress/bean/src/java/org/apache/avalon/fortress/tools/FortressBean.java Index: FortressBean.java =================================================================== RCS file: /home/cvs/avalon-excalibur/fortress/bean/src/java/org/apache/avalon/fortress/tools/FortressBean.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- FortressBean.java 2 Mar 2004 16:20:41 -0000 1.6 +++ FortressBean.java 6 May 2004 11:00:44 -0000 1.7 @@ -18,6 +18,7 @@ package org.apache.avalon.fortress.tools; import java.lang.reflect.Method; +import java.util.Properties; import org.apache.avalon.fortress.impl.DefaultContainer; import org.apache.avalon.fortress.impl.DefaultContainerManager; @@ -40,6 +41,9 @@ */ public class FortressBean implements Initializable, LogEnabled, Serviceable, Disposable { + private static final String COMMONS_LOG_PROPERTY = "org.apache.commons.logging.Log"; + private static final String COMMONS_AVALON_LOGGER = "org.apache.commons.logging.impl.AvalonLogger"; + private final FortressConfig config = new FortressConfig(); private Logger logger = null; private DefaultContainerManager cm; @@ -51,6 +55,8 @@ private boolean systemExitOnDispose = true; + private Properties properties = null; + /** * @see org.apache.avalon.framework.logger.LogEnabled#enableLogging(org.apache.avalon.framework.logger.Logger) */ @@ -69,9 +75,11 @@ public void initialize() throws Exception { //only initialize if we do not already have a servicemanager passed in from outside if (this.sm == null) { + ClassLoader cl = null; + if (this.properties != null) initialize(this.properties); if (Thread.currentThread().getContextClassLoader() == null) { if (this.getClass().getClassLoader() != null) { - ClassLoader cl = this.getClass().getClassLoader(); + cl = this.getClass().getClassLoader(); config.setContextClassLoader(cl); Thread.currentThread().setContextClassLoader(cl); } else { @@ -81,14 +89,76 @@ // Get the root container initialized this.cm = new DefaultContainerManager(config.getContext()); ContainerUtil.initialize(cm); - // set the static logger for commons logging - System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.AvalonLogger"); - + initializeCommonsLogging(cl); this.container = (DefaultContainer) cm.getContainer(); this.sm = container.getServiceManager(); } } + /** + * Use reflection to set up commons logging. If commons logging is available, it will be set up; + * if it is not available, this section is ignored. This needs version 1.0.4 (or later) of commons + * logging, earlier versions do not have avalon support. + * + * @param cl class loader to look for commons logging classes + */ + private void initializeCommonsLogging(ClassLoader cl) { + try { + //if commons logging is available, set the static logger for commons logging + Class commonsLoggerClass; + if (cl != null) { + commonsLoggerClass = cl.loadClass(COMMONS_AVALON_LOGGER); + } else { + commonsLoggerClass = Class.forName(COMMONS_AVALON_LOGGER); + } + Method setDefaultLoggerMethod = commonsLoggerClass.getMethod("setDefaultLogger", new Class[] {Logger.class}); + setDefaultLoggerMethod.invoke(null, new Object[] {cm.getLogger()}); + //set the system property to use avalon logger + System.setProperty(COMMONS_LOG_PROPERTY, COMMONS_AVALON_LOGGER); + } catch (Exception e) { + if (getLogger().isDebugEnabled()) getLogger().debug("error while initializing commons logging: " + e.getClass().getName() + ", " + e.getMessage()); + } + } + + private void disposeCommonsLogging() { + System.getProperties().remove(COMMONS_LOG_PROPERTY); + } + + public static final String PROPERTY_CONTAINER_CLASS = "container.class"; + public static final String PROPERTY_CONTAINER_CONFIGURATION = "container.configuration"; + public static final String PROPERTY_CONTEXT_DIRECTORY = "context.directory"; + public static final String PROPERTY_INSTRUMENT_MANAGER_CONFIGURATION = + "instrument.manager.configuration"; + public static final String PROPERTY_INVOKE_METHOD = "invoke.method"; + public static final String PROPERTY_LOGGER_MANAGER_CONFIGURATION = "logger.manager.configuration"; + public static final String PROPERTY_LOOKUP_COMPONENT_ROLE = "lookup.component.role"; + public static final String PROPERTY_ROLE_MANAGER_CONFIGURATION = "role.manager.configuration"; + public static final String PROPERTY_SYSTEM_EXIT_ON_DISPOSE = "system.exit.on.dispose"; + public static final String PROPERTY_WORK_DIRECTORY = "work.directory"; + + public void initialize(Properties p) throws Exception { + if (p.getProperty(PROPERTY_CONTAINER_CLASS) != null) + this.setContainerClass(p.getProperty(PROPERTY_CONTAINER_CLASS)); + if (p.getProperty(PROPERTY_CONTAINER_CONFIGURATION) != null) + this.setContainerConfiguration(p.getProperty(PROPERTY_CONTAINER_CONFIGURATION)); + if (p.getProperty(PROPERTY_CONTEXT_DIRECTORY) != null) + this.setContextDirectory(p.getProperty(PROPERTY_CONTEXT_DIRECTORY)); + if (p.getProperty(PROPERTY_INSTRUMENT_MANAGER_CONFIGURATION) != null) + this.setInstrumentManagerConfiguration(p.getProperty(PROPERTY_INSTRUMENT_MANAGER_CONFIGURATION)); + if (p.getProperty(PROPERTY_INVOKE_METHOD) != null) + this.setInvokeMethod(p.getProperty(PROPERTY_INVOKE_METHOD)); + if (p.getProperty(PROPERTY_LOGGER_MANAGER_CONFIGURATION) != null) + this.setLoggerManagerConfiguration(p.getProperty(PROPERTY_LOGGER_MANAGER_CONFIGURATION)); + if (p.getProperty(PROPERTY_LOOKUP_COMPONENT_ROLE) != null) + this.setLookupComponentRole(p.getProperty(PROPERTY_LOOKUP_COMPONENT_ROLE)); + if (p.getProperty(PROPERTY_ROLE_MANAGER_CONFIGURATION) != null) + this.setRoleManagerConfiguration(p.getProperty(PROPERTY_ROLE_MANAGER_CONFIGURATION)); + if (p.getProperty(PROPERTY_SYSTEM_EXIT_ON_DISPOSE) != null) + this.setSystemExitOnDispose(Boolean.valueOf(p.getProperty(PROPERTY_SYSTEM_EXIT_ON_DISPOSE)).booleanValue()); + if (p.getProperty(PROPERTY_WORK_DIRECTORY) != null) + this.setWorkDirectory(p.getProperty(PROPERTY_WORK_DIRECTORY)); + } + public void run() throws Exception { Object component = getServiceManager().lookup(lookupComponentRole); Method method = component.getClass().getMethod(invokeMethod, null); @@ -125,7 +195,7 @@ public void dispose() { // Properly clean up when we are done org.apache.avalon.framework.container.ContainerUtil.dispose( cm ); - + disposeCommonsLogging(); //system exit, in case we were running some GUI and some thread is still active if (this.systemExitOnDispose) { Thread.yield(); @@ -192,6 +262,18 @@ */ public void setSystemExitOnDispose(boolean systemExitOnDispose) { this.systemExitOnDispose = systemExitOnDispose; + } + + public static void main(String[] args) { + FortressBean bean = new FortressBean(); + bean.setProperties(System.getProperties()); + if (args.length > 0) bean.setLookupComponentRole(args[0]); + if (args.length > 1) bean.setInvokeMethod(args[1]); + bean.execute(); + } + + public void setProperties(Properties properties) { + this.properties = properties; } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]