001: /* ====================================================================
002: * The Jcorporate Apache Style Software License, Version 1.2 05-07-2002
003: *
004: * Copyright (c) 1995-2003 Jcorporate Ltd. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by Jcorporate Ltd.
021: * (http://www.jcorporate.com/)."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. "Jcorporate" and product names such as "Expresso" must
026: * not be used to endorse or promote products derived from this
027: * software without prior written permission. For written permission,
028: * please contact info@jcorporate.com.
029: *
030: * 5. Products derived from this software may not be called "Expresso",
031: * or other Jcorporate product names; nor may "Expresso" or other
032: * Jcorporate product names appear in their name, without prior
033: * written permission of Jcorporate Ltd.
034: *
035: * 6. No product derived from this software may compete in the same
036: * market space, i.e. framework, without prior written permission
037: * of Jcorporate Ltd. For written permission, please contact
038: * partners@jcorporate.com.
039: *
040: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
041: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
042: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
043: * DISCLAIMED. IN NO EVENT SHALL JCORPORATE LTD OR ITS CONTRIBUTORS
044: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
045: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
046: * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
047: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
048: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
049: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
050: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
051: * SUCH DAMAGE.
052: * ====================================================================
053: *
054: * This software consists of voluntary contributions made by many
055: * individuals on behalf of the Jcorporate Ltd. Contributions back
056: * to the project(s) are encouraged when you make modifications.
057: * Please send them to support@jcorporate.com. For more information
058: * on Jcorporate Ltd. and its products, please see
059: * <http://www.jcorporate.com/>.
060: *
061: * Portions of this software are based upon other open source
062: * products and are subject to their respective licenses.
063: */
064: package com.jcorporate.expresso.kernel;
065:
066: import org.apache.log4j.Logger;
067: import org.apache.log4j.xml.DOMConfigurator;
068:
069: import java.io.File;
070: import java.io.IOException;
071: import java.net.URL;
072:
073: /**
074: * New LogManager implementation. Loads and configures log4j and also provides
075: * classloader reloading capabilities if you wish to have log4j low on the classloader
076: * hierarchy and want your webapps to reload ok.
077: *
078: * @author Michael Rimov
079: */
080: public final class LogManager {
081: public static long lastChecked = System.currentTimeMillis();
082:
083: private static boolean initialized = false;
084:
085: /**
086: * Default Constructor. Do not use
087: */
088: protected LogManager() {
089:
090: }
091:
092: /**
093: * Construct the log manager given the location of the file and log directory
094: *
095: * @param logConfigFile may be null if you initialize log4j through some other
096: * way such as static class resource, or system property.
097: * @param logDirectory may be null if you don't expand any expresso-related
098: * macros in the logging file.
099: */
100: public LogManager(String logConfigFile, String logDirectory) {
101: initialize(logConfigFile, logDirectory);
102: }
103:
104: /**
105: * Constructs and initializes the logging system given the URL of a config file
106: * [Classloader friendly] and destination of the log directory
107: *
108: * @param logConfigFile cannot be null
109: * @param logDirectory may be null if you don't expand any expresso-related
110: * macros in the logging file.
111: */
112: public LogManager(URL logConfigFile, String logDirectory) {
113: initialize(logConfigFile, logDirectory);
114: }
115:
116: /**
117: * Destroy the lastUsed Map
118: */
119: public static void destroy() {
120: initialized = false;
121: org.apache.log4j.LogManager.shutdown();
122: }
123:
124: /**
125: * Sets up the whole logging system. expressoLogging.xml must exist in the
126: * system. After that, it parses all .xml files that have doctype of
127: * Configuration. Called through instantiate() function.
128: *
129: * @param loggingConfiguration The location of the logging configuration. May
130: * be overridden by the <code>log4j.configuration</code> System property.
131: * @param loggingDirectory The location of where Expresso should log it's
132: * data.
133: * @throws IllegalArgumentException if any of the arguments fail.
134: */
135: synchronized private void initialize(String loggingConfiguration,
136: String loggingDirectory) {
137: synchronized (LogManager.class) {
138: if (initialized) {
139: return;
140: }
141:
142: if (loggingConfiguration == null) {
143: loggingConfiguration = System.getProperty(
144: "log4j.configuration", null);
145: }
146:
147: java.net.URL configFile;
148: if (loggingConfiguration == null) {
149: configFile = this .getClass().getResource("log4j.xml");
150: } else {
151: initLoggingDirectory(loggingDirectory);
152: java.io.File f = new java.io.File(loggingConfiguration);
153: if (f == null) {
154: throw new IllegalArgumentException(
155: "Unable to locate logging configuration file "
156: + loggingConfiguration);
157: }
158: DOMConfigurator.configureAndWatch(loggingConfiguration,
159: 5000);
160: Logger log = Logger.getLogger(LogManager.class);
161: if (log.isInfoEnabled()) {
162: log
163: .info("Logging Configuration Complete. Config File: "
164: + loggingConfiguration);
165: }
166: return;
167: }
168:
169: if (configFile == null) {
170: throw new IllegalArgumentException(
171: "Unable to locate a log4j "
172: + "configuration file, either through log.xml or loggingConfiguration parameter");
173: }
174:
175: initialize(configFile, loggingDirectory);
176: }
177: } /* initialize() */
178:
179: /**
180: * Initialize the system parameters for the logging directory (optional)
181: *
182: * @param loggingDirectory The location of where to save the logging directory.
183: * May be overridden by <code>expresso.logDir</code> system property.
184: */
185: private void initLoggingDirectory(String loggingDirectory) {
186: if (loggingDirectory == null) {
187: return;
188: }
189:
190: if (loggingDirectory != null && loggingDirectory.length() > 0
191: && System.getProperty("expresso.logDir", null) == null) {
192: System.setProperty("expresso.logDir", loggingDirectory);
193: }
194: File logdir = new File(loggingDirectory);
195: if (!logdir.exists()) {
196: logdir.mkdirs();
197: }
198: try {
199: System.out.println("Logging directory is: "
200: + logdir.getCanonicalPath());
201: } catch (IOException e) {
202: e.printStackTrace();
203: }
204:
205: }
206:
207: protected void initialize(URL loggingConfiguration,
208: String loggingDirectory) {
209: initLoggingDirectory(loggingDirectory);
210:
211: DOMConfigurator.configure(loggingConfiguration);
212: Logger log = Logger.getLogger(LogManager.class);
213: if (log.isInfoEnabled()) {
214: log
215: .info("Logging Configuration Complete. Using config URL: "
216: + loggingConfiguration.toString());
217: }
218:
219: }
220:
221: }
|