001: /*--
002:
003: Copyright (C) 2002-2005 Adrian Price.
004: 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 disclaimer that follows
015: these conditions in the documentation and/or other materials
016: provided with the distribution.
017:
018: 3. The names "OBE" and "Open Business Engine" must not be used to
019: endorse or promote products derived from this software without prior
020: written permission. For written permission, please contact
021: adrianprice@sourceforge.net.
022:
023: 4. Products derived from this software may not be called "OBE" or
024: "Open Business Engine", nor may "OBE" or "Open Business Engine"
025: appear in their name, without prior written permission from
026: Adrian Price (adrianprice@users.sourceforge.net).
027:
028: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
029: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
030: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
031: DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
032: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
033: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
034: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
035: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
036: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
037: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
038: POSSIBILITY OF SUCH DAMAGE.
039:
040: For more information on OBE, please see
041: <http://obe.sourceforge.net/>.
042:
043: */
044:
045: package org.obe.server.j2ee;
046:
047: import org.apache.commons.logging.Log;
048: import org.apache.commons.logging.LogFactory;
049: import org.apache.log4j.Level;
050: import org.apache.log4j.Logger;
051: import org.obe.client.api.repository.RepositoryException;
052: import org.obe.engine.WorkflowEngine;
053: import org.obe.server.j2ee.repository.AuditAppender;
054: import org.obe.spi.service.ServiceManager;
055:
056: import java.io.IOException;
057:
058: /**
059: * Manages the configuration and initialization of the OBE J2EE Server.
060: *
061: * @author Adrian Price
062: */
063: public final class J2EEServerConfig {
064: public static final WorkflowEngine engine;
065: public static final ServiceManager svcMgr;
066: private static final Log _logger = LogFactory
067: .getLog(J2EEServerConfig.class);
068: private static boolean _initialized;
069: private static final int INIT_WAIT_MILLIS = 500;
070:
071: static {
072: svcMgr = new ServiceManager();
073: engine = svcMgr.getEngine();
074: }
075:
076: private J2EEServerConfig() {
077: }
078:
079: public static synchronized void init() throws IOException,
080: RepositoryException {
081:
082: if (!_initialized) {
083: // We must configure our log4j audit appender programmatically,
084: // because the appender class is part of a J2EE application. The
085: // code below is equivalent to the following log4j.properties:
086: //
087: // log4j.appender.OBEAudit=org.obe.server.j2ee.repository.AuditAppender
088: // log4j.logger.org.obe.audit=INFO, OBEAudit
089: // log4j.additivity.org.obe.audit=false
090: AuditAppender appender = new AuditAppender();
091: appender.setName("OBEAudit");
092: appender.setThreshold(Level.INFO);
093: Logger auditLogger = Logger.getLogger("org.obe.audit");
094: auditLogger.addAppender(appender);
095: auditLogger.setAdditivity(false);
096: _logger.info("Configured audit appender");
097:
098: svcMgr.init();
099:
100: _initialized = true;
101: _logger.info("OBE/J2EE initialization complete");
102: }
103: }
104:
105: public static synchronized void exit() throws RepositoryException {
106: if (_initialized) {
107: // We must unconfigure our log4j audit appender programmatically,
108: // because the appender class is part of a J2EE application that
109: // could be redeployed.
110: Logger auditLogger = Logger.getLogger("org.obe.audit");
111: auditLogger.removeAppender("OBEAudit");
112: _logger.info("Unconfigured audit appender");
113:
114: svcMgr.exit();
115: _initialized = false;
116: _logger.info("OBE/J2EE de-initialization complete");
117: }
118: }
119:
120: public static boolean isInitialized() {
121: return _initialized;
122: }
123:
124: public static void waitUntilInitialized(Log logger) {
125: if (!_initialized) {
126: logger.info("Waiting for server to initialize");
127: do {
128: try {
129: Thread.sleep(INIT_WAIT_MILLIS);
130: } catch (InterruptedException e) {
131: // No worries - just loop until server is up.
132: }
133: } while (!_initialized);
134: }
135: }
136: }
|