Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.openejb.util;
import org.apache.openejb.loader.IO;
import org.apache.openejb.loader.SystemInstance;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.Properties;
import java.util.ResourceBundle;
public class Logger {
private static final String SUFFIX = ".Messages";
private static final String OPENEJB = "org.apache.openejb";
private static volatile LogStreamFactory logStreamFactory;
// don't return the instance since it needs to stay private but export which one is used to allow integration with other libs (as tomcat ;))
@SuppressWarnings("UnusedDeclaration")
public static String delegateClass() {
if (logStreamFactory == null) {
throw new IllegalStateException("Call this method after having configured the logger");
}
return logStreamFactory.getClass().getName();
}
public static synchronized void configure() {
configure(false);
}
public static synchronized void configure(final boolean reset) {
if(reset){
logStreamFactory = null;
}
configure(System.getProperties());
}
public static synchronized void configure(final Properties config) {
if (logStreamFactory != null) {
return;
}
//See if user factory has been specified
final String julFqn = JuliLogStreamFactory.class.getName();
String factoryName = config.getProperty("openejb.log.factory",
SystemInstance.isInitialized() ? SystemInstance.get().getOptions().get("openejb.log.factory", julFqn) : julFqn);
if ("jul".equalsIgnoreCase(factoryName) || "juli".equalsIgnoreCase(factoryName)) {
factoryName = julFqn;
} else if ("slf4j".equalsIgnoreCase(factoryName)) {
factoryName = Slf4jLogStreamFactory.class.getName();
} else if ("log4j".equalsIgnoreCase(factoryName)) {
if (exists("org.apache.log4j.Logger")) {
// don't use .class to avoid to force loading since log4j is not mandatory
factoryName = "org.apache.openejb.util.Log4jLogStreamFactory";
} else {
System.out.println("Cannot respect 'openejb.log.factory=log4j' setting as Log4j is not in the classpath.");
}
} else if ("pax".equalsIgnoreCase(factoryName)) {
factoryName = "org.apache.openejb.util.PaxLogStreamFactory";
}
// we can be called before having SystemInstance so we need this hack to set some specific environment
// without changing LogStreamFactory contract
final String[] specialKeys = new String[] { "openejb.jul.forceReload", "openejb.jul.consoleHandlerClazz" };
final String[] originals = new String[specialKeys.length];
for (int i = 0; i < specialKeys.length; i++) {
originals[i] = System.getProperty(specialKeys[i]);
final String property = config.getProperty(
specialKeys[i],
SystemInstance.isInitialized() ? SystemInstance.get().getOptions().get(specialKeys[i], (String) null) : null);
if (property != null) {
System.setProperty(specialKeys[i], property);
}
}
try {
if (factoryName != null) {
logStreamFactory = createFactory(factoryName);
}
if (isLog4jImplied()) {
logStreamFactory = createFactory("org.apache.openejb.util.Log4jLogStreamFactory");
}
//Fall back -> JUL
if (logStreamFactory == null) {
logStreamFactory = new JuliLogStreamFactory();
}
checkForIgnoredLog4jConfig();
} finally {
for (int i = 0; i < specialKeys.length; i++) {
if (originals[i] == null) {
System.clearProperty(specialKeys[i]);
} else {
System.setProperty(specialKeys[i], originals[i]);
}
}
}
}
private static void checkForIgnoredLog4jConfig() {
if (logStreamFactory.getClass().getName().equals("org.apache.openejb.util.Log4jLogStreamFactory")) {
return;
}
try {
final Properties configFile = log4j(loadLoggingProperties());
final Properties systemProperties = log4j(SystemInstance.get().getProperties());
if (configFile.size() == 0 && systemProperties.size() == 0) {
return;
}
final LogStream stream = logStreamFactory.createLogStream(LogCategory.OPENEJB);
stream.warn("Log4j not installed. The following properties will be ignored.");
final String format = "Ignored %s property '%s'";
for (final Object key : configFile.keySet()) {
stream.warn(String.format(format, "conf/logging.properties", key));
}
for (final Object key : systemProperties.keySet()) {
stream.warn(String.format(format, "Property overrides", key));
}
} catch (final Throwable e) {
// added strong catch block just in case
// This check is only a convenience
}
}
private static LogStreamFactory createFactory(final String factoryName) {
final Class> factoryClass = load(factoryName);
if (factoryClass == null) {
return null;
}
try {
//Try and use the user specified factory
return (LogStreamFactory) factoryClass.newInstance();
} catch (final Throwable e) {
//Ignore
}
return null;
}
private static Class> load(final String factoryName) {
try {
final ClassLoader classLoader = Logger.class.getClassLoader();
return classLoader.loadClass(factoryName);
} catch (final Throwable e) {
//Ignore
}
try {
final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
return contextClassLoader.loadClass(factoryName);
} catch (final Throwable e1) {
//Ignore
}
try {
return Class.forName(factoryName);
} catch (final Throwable e2) {
//Ignore
}
return null;
}
/**
* Computes the parent of a resource name. E.g. if we pass in a key of
* a.b.c, it returns the value a.b
*/
private static final Computable heirarchyResolver = new Computable() {
@Override
public String compute(final String key) throws InterruptedException {
final int index = key.lastIndexOf(".");
final String parent = key.substring(0, index);
if (parent.contains(OPENEJB)) {
return parent;
}
return null;
}
};
/**
* Simply returns the ResourceBundle for a given baseName
*/
private static final Computable bundleResolver = new Computable() {
@Override
public ResourceBundle compute(final String baseName) throws InterruptedException {
try {
return ResourceBundle.getBundle(baseName + SUFFIX);
} catch (final MissingResourceException e) {
return null;
}
}
};
/**
* Builds a Logger object and returns it
*/
private static final Computable