|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.rmi.runtime; |
|
|
|
import java.io.ByteArrayOutputStream; |
|
import java.io.IOException; |
|
import java.io.PrintStream; |
|
import java.io.OutputStream; |
|
import java.rmi.server.LogStream; |
|
import java.util.logging.ConsoleHandler; |
|
import java.util.logging.Handler; |
|
import java.util.logging.Formatter; |
|
import java.util.logging.SimpleFormatter; |
|
import java.util.logging.StreamHandler; |
|
import java.util.logging.Level; |
|
import java.util.logging.Logger; |
|
import java.util.logging.LogManager; |
|
import java.util.logging.LogRecord; |
|
import java.util.logging.StreamHandler; |
|
import java.util.Map; |
|
import java.util.HashMap; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
@SuppressWarnings("deprecation") |
|
public abstract class Log { |
|
|
|
|
|
public static final Level BRIEF = Level.FINE; |
|
public static final Level VERBOSE = Level.FINER; |
|
|
|
|
|
private static final LogFactory logFactory; |
|
static { |
|
boolean useOld = |
|
Boolean.valueOf(java.security.AccessController. |
|
doPrivileged(new sun.security.action.GetPropertyAction( |
|
"sun.rmi.log.useOld"))).booleanValue(); |
|
|
|
|
|
logFactory = (useOld ? (LogFactory) new LogStreamLogFactory() : |
|
(LogFactory) new LoggerLogFactory()); |
|
} |
|
|
|
|
|
public abstract boolean isLoggable(Level level); |
|
public abstract void log(Level level, String message); |
|
public abstract void log(Level level, String message, Throwable thrown); |
|
|
|
|
|
public abstract void setOutputStream(OutputStream stream); |
|
public abstract PrintStream getPrintStream(); |
|
|
|
|
|
private static interface LogFactory { |
|
Log createLog(String loggerName, String oldLogName, Level level); |
|
} |
|
|
|
/* access log objects */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static Log getLog(String loggerName, String oldLogName, |
|
int override) |
|
{ |
|
Level level; |
|
|
|
if (override < 0) { |
|
level = null; |
|
} else if (override == LogStream.SILENT) { |
|
level = Level.OFF; |
|
} else if ((override > LogStream.SILENT) && |
|
(override <= LogStream.BRIEF)) { |
|
level = BRIEF; |
|
} else if ((override > LogStream.BRIEF) && |
|
(override <= LogStream.VERBOSE)) |
|
{ |
|
level = VERBOSE; |
|
} else { |
|
level = Level.FINEST; |
|
} |
|
return logFactory.createLog(loggerName, oldLogName, level); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static Log getLog(String loggerName, String oldLogName, |
|
boolean override) |
|
{ |
|
Level level = (override ? VERBOSE : null); |
|
return logFactory.createLog(loggerName, oldLogName, level); |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
private static class LoggerLogFactory implements LogFactory { |
|
LoggerLogFactory() {} |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public Log createLog(final String loggerName, String oldLogName, |
|
final Level level) |
|
{ |
|
Logger logger = Logger.getLogger(loggerName); |
|
return new LoggerLog(logger, level); |
|
} |
|
} |
|
|
|
|
|
|
|
*/ |
|
private static class LoggerLog extends Log { |
|
|
|
|
|
private static final Handler alternateConsole = |
|
java.security.AccessController.doPrivileged( |
|
new java.security.PrivilegedAction<Handler>() { |
|
public Handler run() { |
|
InternalStreamHandler alternate = |
|
new InternalStreamHandler(System.err); |
|
alternate.setLevel(Level.ALL); |
|
return alternate; |
|
} |
|
}); |
|
|
|
|
|
private InternalStreamHandler copyHandler = null; |
|
|
|
|
|
private final Logger logger; |
|
|
|
|
|
private LoggerPrintStream loggerSandwich; |
|
|
|
|
|
private LoggerLog(final Logger logger, final Level level) { |
|
this.logger = logger; |
|
|
|
if (level != null){ |
|
java.security.AccessController.doPrivileged( |
|
new java.security.PrivilegedAction<Void>() { |
|
public Void run() { |
|
if (!logger.isLoggable(level)) { |
|
logger.setLevel(level); |
|
} |
|
logger.addHandler(alternateConsole); |
|
return null; |
|
} |
|
} |
|
); |
|
} |
|
} |
|
|
|
public boolean isLoggable(Level level) { |
|
return logger.isLoggable(level); |
|
} |
|
|
|
public void log(Level level, String message) { |
|
if (isLoggable(level)) { |
|
String[] source = getSource(); |
|
logger.logp(level, source[0], source[1], |
|
Thread.currentThread().getName() + ": " + message); |
|
} |
|
} |
|
|
|
public void log(Level level, String message, Throwable thrown) { |
|
if (isLoggable(level)) { |
|
String[] source = getSource(); |
|
logger.logp(level, source[0], source[1], |
|
Thread.currentThread().getName() + ": " + |
|
message, thrown); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public synchronized void setOutputStream(OutputStream out) { |
|
if (out != null) { |
|
if (!logger.isLoggable(VERBOSE)) { |
|
logger.setLevel(VERBOSE); |
|
} |
|
copyHandler = new InternalStreamHandler(out); |
|
copyHandler.setLevel(Log.VERBOSE); |
|
logger.addHandler(copyHandler); |
|
} else { |
|
|
|
if (copyHandler != null) { |
|
logger.removeHandler(copyHandler); |
|
} |
|
copyHandler = null; |
|
} |
|
} |
|
|
|
public synchronized PrintStream getPrintStream() { |
|
if (loggerSandwich == null) { |
|
loggerSandwich = new LoggerPrintStream(logger); |
|
} |
|
return loggerSandwich; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
private static class InternalStreamHandler extends StreamHandler { |
|
InternalStreamHandler(OutputStream out) { |
|
super(out, new SimpleFormatter()); |
|
} |
|
|
|
public void publish(LogRecord record) { |
|
super.publish(record); |
|
flush(); |
|
} |
|
|
|
public void close() { |
|
flush(); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
private static class LoggerPrintStream extends PrintStream { |
|
|
|
|
|
private final Logger logger; |
|
|
|
|
|
private int last = -1; |
|
|
|
|
|
private final ByteArrayOutputStream bufOut; |
|
|
|
private LoggerPrintStream(Logger logger) |
|
{ |
|
super(new ByteArrayOutputStream()); |
|
bufOut = (ByteArrayOutputStream) super.out; |
|
this.logger = logger; |
|
} |
|
|
|
public void write(int b) { |
|
if ((last == '\r') && (b == '\n')) { |
|
last = -1; |
|
return; |
|
} else if ((b == '\n') || (b == '\r')) { |
|
try { |
|
|
|
String message = |
|
Thread.currentThread().getName() + ": " + |
|
bufOut.toString(); |
|
logger.logp(Level.INFO, "LogStream", "print", message); |
|
} finally { |
|
bufOut.reset(); |
|
} |
|
} else { |
|
super.write(b); |
|
} |
|
last = b; |
|
} |
|
|
|
public void write(byte b[], int off, int len) { |
|
if (len < 0) { |
|
throw new ArrayIndexOutOfBoundsException(len); |
|
} |
|
for (int i = 0; i < len; i++) { |
|
write(b[off + i]); |
|
} |
|
} |
|
|
|
public String toString() { |
|
return "RMI"; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
private static class LogStreamLogFactory implements LogFactory { |
|
LogStreamLogFactory() {} |
|
|
|
|
|
public Log createLog(String loggerName, String oldLogName, |
|
Level level) |
|
{ |
|
LogStream stream = null; |
|
if (oldLogName != null) { |
|
stream = LogStream.log(oldLogName); |
|
} |
|
return new LogStreamLog(stream, level); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
private static class LogStreamLog extends Log { |
|
|
|
private final LogStream stream; |
|
|
|
|
|
private int levelValue = Level.OFF.intValue(); |
|
|
|
private LogStreamLog(LogStream stream, Level level) { |
|
if ((stream != null) && (level != null)) { |
|
|
|
|
|
*/ |
|
levelValue = level.intValue(); |
|
} |
|
this.stream = stream; |
|
} |
|
|
|
public synchronized boolean isLoggable(Level level) { |
|
return (level.intValue() >= levelValue); |
|
} |
|
|
|
public void log(Level messageLevel, String message) { |
|
if (isLoggable(messageLevel)) { |
|
String[] source = getSource(); |
|
stream.println(unqualifiedName(source[0]) + |
|
"." + source[1] + ": " + message); |
|
} |
|
} |
|
|
|
public void log(Level level, String message, Throwable thrown) { |
|
if (isLoggable(level)) { |
|
|
|
|
|
|
|
*/ |
|
synchronized (stream) { |
|
String[] source = getSource(); |
|
stream.println(unqualifiedName(source[0]) + "." + |
|
source[1] + ": " + message); |
|
thrown.printStackTrace(stream); |
|
} |
|
} |
|
} |
|
|
|
public PrintStream getPrintStream() { |
|
return stream; |
|
} |
|
|
|
public synchronized void setOutputStream(OutputStream out) { |
|
if (out != null) { |
|
if (VERBOSE.intValue() < levelValue) { |
|
levelValue = VERBOSE.intValue(); |
|
} |
|
stream.setOutputStream(out); |
|
} else { |
|
|
|
levelValue = Level.OFF.intValue(); |
|
} |
|
} |
|
|
|
|
|
|
|
*/ |
|
private static String unqualifiedName(String name) { |
|
int lastDot = name.lastIndexOf("."); |
|
if (lastDot >= 0) { |
|
name = name.substring(lastDot + 1); |
|
} |
|
name = name.replace('$', '.'); |
|
return name; |
|
} |
|
} |
|
|
|
|
|
|
|
*/ |
|
private static String[] getSource() { |
|
StackTraceElement[] trace = (new Exception()).getStackTrace(); |
|
return new String[] { |
|
trace[3].getClassName(), |
|
trace[3].getMethodName() |
|
}; |
|
} |
|
} |