Author: sylvain
Date: Wed Nov 10 10:12:51 2004
New Revision: 57344
Modified:
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/bean/CocoonWrapper.java
cocoon/branches/BRANCH_2_1_X/status.xml
Log:
CocoonBean has its own logkit hierarchy
Modified:
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/bean/CocoonWrapper.java
==============================================================================
---
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/bean/CocoonWrapper.java
(original)
+++
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/bean/CocoonWrapper.java
Wed Nov 10 10:12:51 2004
@@ -77,6 +77,7 @@
private String workDir = Constants.DEFAULT_WORK_DIR;
private String logKit = null;
protected String logger = null;
+ protected String logLevel = "ERROR";
private String userAgent = DEFAULT_USER_AGENT;
private String accept = DEFAULT_ACCEPT;
private List classList = new ArrayList();
@@ -88,8 +89,9 @@
// Internal Objects
private CommandLineContext cliContext;
+ private LogKitLoggerManager logManager;
private Cocoon cocoon;
- protected static Logger log;
+ protected Logger log;
private Map attributes = new HashMap();
private HashMap empty = new HashMap();
@@ -99,27 +101,30 @@
// INITIALISATION METHOD
//
public void initialize() throws Exception {
- // @todo@ when does the logger get initialised? uv
// @todo@ these should log then throw exceptions back to the caller,
not use system.exit()
- setLogLevel("ERROR");
- this.context = getDir(this.contextDir, "context");
- this.work = getDir(workDir, "working");
-
- this.conf = getConfigurationFile(this.context, this.configFile);
+ // Create a new hierarchy. This is needed when CocoonBean is called
from
+ // within a CocoonServlet call, in order not to mix logs
+ final Hierarchy hierarchy = new Hierarchy();
+
+ final Priority priority = Priority.getPriorityForName(logLevel);
+ hierarchy.setDefaultPriority(priority);
+
+ // Install a temporary logger so that getDir() can log if needed
+ this.log = new LogKitLogger(hierarchy.getLoggerFor(""));
try {
+ // First of all, initialize the logging system
+
+ // Setup the application context with context-dir and work-dir that
+ // can be used in logkit.xconf
+ this.context = getDir(this.contextDir, "context");
+ this.work = getDir(workDir, "working");
DefaultContext appContext = new DefaultContext();
- appContext.put(Constants.CONTEXT_CLASS_LOADER,
- CocoonWrapper.class.getClassLoader());
- cliContext = new CommandLineContext(contextDir);
- cliContext.enableLogging(log);
- appContext.put(Constants.CONTEXT_ENVIRONMENT_CONTEXT, cliContext);
appContext.put(Constants.CONTEXT_WORK_DIR, work);
- LogKitLoggerManager logKitLoggerManager =
- new LogKitLoggerManager(Hierarchy.getDefaultHierarchy());
- logKitLoggerManager.enableLogging(log);
+ this.logManager = new LogKitLoggerManager(hierarchy);
+ this.logManager.enableLogging(log);
if (this.logKit != null) {
final FileInputStream fis = new FileInputStream(logKit);
@@ -128,15 +133,24 @@
final Configuration logKitConf = builder.build(fis);
final DefaultContext subcontext = new
DefaultContext(appContext);
subcontext.put("context-root", this.contextDir);
- logKitLoggerManager.contextualize(subcontext);
- logKitLoggerManager.configure(logKitConf);
+ subcontext.put("context-work", this.workDir);
+ this.logManager.contextualize(subcontext);
+ this.logManager.configure(logKitConf);
if (logger != null) {
- log = logKitLoggerManager.getLoggerForCategory(logger);
+ log = this.logManager.getLoggerForCategory(logger);
} else {
- log = logKitLoggerManager.getLoggerForCategory("cocoon");
+ log = this.logManager.getLoggerForCategory("cocoon");
}
}
+ this.conf = getConfigurationFile(this.context, this.configFile);
+
+ cliContext = new CommandLineContext(contextDir);
+ cliContext.enableLogging(log);
+
+ appContext.put(Constants.CONTEXT_ENVIRONMENT_CONTEXT, cliContext);
+ appContext.put(Constants.CONTEXT_CLASS_LOADER,
+ CocoonWrapper.class.getClassLoader());
appContext.put(Constants.CONTEXT_CLASSPATH,
getClassPath(contextDir));
appContext.put(Constants.CONTEXT_UPLOAD_DIR, contextDir +
"upload-dir");
File cacheDir = getDir(workDir + File.separator + "cache-dir",
"cache");
@@ -149,7 +163,7 @@
cocoon = new Cocoon();
ContainerUtil.enableLogging(cocoon, log);
ContainerUtil.contextualize(cocoon, appContext);
- cocoon.setLoggerManager(logKitLoggerManager);
+ cocoon.setLoggerManager(logManager);
ContainerUtil.initialize(cocoon);
} catch (Exception e) {
@@ -170,7 +184,7 @@
* @return a <code>File</code> representing the configuration
* @exception IOException if an error occurs
*/
- private static File getConfigurationFile(File dir, String configFile)
+ private File getConfigurationFile(File dir, String configFile)
throws IOException {
File conf;
if (configFile == null) {
@@ -208,7 +222,7 @@
/**
* Try loading the configuration file from a single location
*/
- private static File tryConfigurationFile(String filename) {
+ private File tryConfigurationFile(String filename) {
if (log.isDebugEnabled()) {
log.debug("Trying configuration file at: " + filename);
}
@@ -236,19 +250,16 @@
if (!d.exists()) {
if (!d.mkdirs()) {
- log.error("Error creating " + type + " directory '" + d + "'");
throw new IOException(
"Error creating " + type + " directory '" + d + "'");
}
}
if (!d.isDirectory()) {
- log.error("'" + d + "' is not a directory.");
throw new IOException("'" + d + "' is not a directory.");
}
if (!(d.canRead() && d.canWrite())) {
- log.error("Directory '" + d + "' is not readable/writable");
throw new IOException(
"Directory '" + d + "' is not readable/writable");
}
@@ -297,9 +308,7 @@
* @param logLevel log level
*/
public void setLogLevel(String logLevel) {
- final Priority priority = Priority.getPriorityForName(logLevel);
- Hierarchy.getDefaultHierarchy().setDefaultPriority(priority);
- CocoonWrapper.log = new
LogKitLogger(Hierarchy.getDefaultHierarchy().getLoggerFor(""));
+ this.logLevel = logLevel;
}
/**
@@ -383,6 +392,7 @@
this.initialized = false;
ContainerUtil.dispose(this.cocoon);
this.cocoon = null;
+ this.logManager.dispose();
if (log.isDebugEnabled()) {
log.debug("Disposed");
}
@@ -508,7 +518,7 @@
* @param context The context path
* @return a <code>String</code> value
*/
- protected static String getClassPath(final String context) {
+ protected String getClassPath(final String context) {
StringBuffer buildClassPath = new StringBuffer();
String classDir = context + "/WEB-INF/classes";
Modified: cocoon/branches/BRANCH_2_1_X/status.xml
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/status.xml (original)
+++ cocoon/branches/BRANCH_2_1_X/status.xml Wed Nov 10 10:12:51 2004
@@ -199,6 +199,11 @@
<changes>
<release version="@version@" date="@date@">
+ <action dev="SW" type="fix">
+ The CocoonBean now creates its own private logger hierarchy, thus
avoiding to pollute the CocoonServlet
+ hierarchy when called in that context (e.g. when generating a static site
from a CMS)
+ </action>
+
<action dev="GP" type="add">
Added replacement for Excalibur Event package in
org.apache.cocoon.components.thread and migrated most
classes using their own threads to that package