blob: e72c5062103ca0b3b60e1fc4e1615402503b93b8 [file] [log] [blame]
/*
* Copyright 2010 Google Inc.
*
* Licensed 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 com.google.gwt.logging.impl;
import com.google.gwt.core.client.GWT;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
/**
* This class is used by the byte code rewriting which happens in DevMode only.
* We rewrite all calls that create and access loggers by name to include a
* magic, thread specific prefix, which creates a separate tree of loggers for
* each thread in DevMode. This works around the issue where DevMode root
* loggers are shared between threads and between client/server. These functions
* will never be used in Production compiles.
*
* TODO(unnurg): Move this class into gwt-dev
*
* @see UseMirroredClasses
*/
public class DevModeLoggingFixes {
private static Logger root = null;
/**
* Replaces all logRecord.getLoggerName() calls, removing a thread specific
* prefix which is appended to all logger names in dev mode in order to
* maintain a pseudo tree of loggers for each thread.
*/
public static String getLoggerName(LogRecord record) {
if (record.getLoggerName() != null) {
return removeLoggerPrefix(record.getLoggerName());
}
return null;
}
/**
* Replaces all logger.getName() calls, removing a thread specific prefix
* which is appended to all logger names in dev mode in order to maintain
* a pseudo tree of loggers for each thread.
*/
public static String getName(Logger logger) {
if (logger.getName() != null) {
return removeLoggerPrefix(logger.getName());
}
return null;
}
/**
* Replaces all Logger.getLogger(name) calls, adding a thread specific prefix
* which is appended to all logger names in dev mode in order to maintain
* a pseudo tree of loggers for each thread.
*/
public static Logger loggerGetLogger(String name) {
// If a library adds Loggers, but does not include the LogConfiguration
// EntryPoint, then the separate root logger does not get created, and set
// to ignore it's parent. In order to ensure that this happens, we do it
// again here.
if (root == null) {
root = Logger.getLogger(getPrefixName());
root.setUseParentHandlers(false);
}
return Logger.getLogger(addLoggerPrefix(name));
}
/**
* Replaces all LogManager.getLogger(name) calls, adding a thread specific
* prefix which is appended to all logger names in dev mode in order to
* maintain a pseudo tree of loggers for each thread.
*/
public static Logger logManagerGetLogger(LogManager manager, String name) {
return manager.getLogger(addLoggerPrefix(name));
}
private static String addLoggerPrefix(String name) {
return getLoggerPrefix() + name;
}
private static String getLoggerPrefix() {
return getPrefixName() + ".";
}
private static String getPrefixName() {
return GWT.getUniqueThreadId();
}
private static String removeLoggerPrefix(String name) {
return name.replaceFirst("^" + getLoggerPrefix(), "");
}
}