/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* 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
*******************************************************************************/
package org.ebayopensource.turmeric.eclipse.core.logging;
import java.text.MessageFormat;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import org.apache.commons.lang.StringUtils;
import org.ebayopensource.turmeric.eclipse.core.TurmericCoreActivator;
import org.ebayopensource.turmeric.eclipse.core.logging.system.ISOALoggingSystemProvider;
import org.ebayopensource.turmeric.eclipse.core.logging.system.SOALoggingSystemExtensionRegistry;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
/**
* <p>This class is intended to be added to the JDK Logging framework.
* This would ensure any logging messages will go through it so that
* we could reformat the log message to follow the SOA logging format.</p>
* @author Yang Yu(yayu@ebay.com)
*
*/
public class PluginLogDelegateHandler
extends Handler
{
private static final String SYSTEM_LINE_SEPARATOR;
private static ILog systemLogger;
/**
* The name of the current build system.
*/
private static String BUILD_SYSTEM_NAME = "V3";
static
{
String separator = System.getProperty("line.separator");
if (separator == null)
separator = "\n";
SYSTEM_LINE_SEPARATOR = separator;
}
private final Formatter formatter = new MySimpleFormatter();
/**
* Instantiates a new plugin log delegate handler.
*/
public PluginLogDelegateHandler() {
super();
}
/* (non-Javadoc)
* @see java.util.logging.Handler#close()
*/
@Override
public void close() throws SecurityException
{
}
/* (non-Javadoc)
* @see java.util.logging.Handler#flush()
*/
@Override
public void flush()
{
}
private int level( final Level level )
{
if( level == null )
return IStatus.INFO;
if( level.intValue() >= Level.SEVERE.intValue() )
return IStatus.ERROR;
if( level.intValue() > Level.WARNING.intValue() )
return IStatus.WARNING;
return IStatus.INFO;
}
/* (non-Javadoc)
* @see java.util.logging.Handler#publish(java.util.logging.LogRecord)
*/
@Override
public void publish( final LogRecord record )
{
if( record == null || StringUtils.isBlank(record.getMessage()))
return;
final int level = level( record.getLevel() );
if (shouldLogRawMessage(record)) {
log( level, record.getLoggerName(), record.getMessage(), null );
} else {
log( level, record.getLoggerName(), StringUtils.replace( formatter.format( record ), "\n", "\n " ), record.getThrown() );
}
}
private boolean shouldLogRawMessage(LogRecord record) {
try {
ISOALoggingSystemProvider logSystemProvider = SOALoggingSystemExtensionRegistry.getInstance()
.getLoggingSystemIDProvider(PluginLogDelegateHandler.getBuildSystemName());
if (logSystemProvider != null) {
return logSystemProvider.shouldLogRawMessage(record);
}
} catch (Exception e) {
//ignore the issue
e.printStackTrace();
}
return false;
}
/**
* Sets the builds the system name.
*
* @param name The new Build System Name
*/
public static void setBuildSystemName(String name) {
if (StringUtils.isNotBlank(name)) {
BUILD_SYSTEM_NAME = name;
if (StringUtils.equals(name, BUILD_SYSTEM_NAME) == false) {
log(IStatus.INFO, PluginLogDelegateHandler.class.getName(),
"Changed system ID to->" + name, null);
}
}
}
/**
* Gets the builds the system name.
*
* @return the builds the system name
*/
public static String getBuildSystemName() {
return BUILD_SYSTEM_NAME;
}
/**
* @param severity The log severity
* @param loggerName The name of the logger
* @param message The message body
* @param throwable The exception instance or null if no exception.
*/
private static void log( final int severity,
final String loggerName,
final String message,
final Throwable throwable )
{
if( TurmericCoreActivator.getDefault() == null )
//the Activator has not been initialized yet
return;
if (systemLogger == null)
systemLogger = TurmericCoreActivator.getDefault().getLog();
systemLogger.log( new Status( severity, loggerName, 0, StringUtils.defaultString( message ), throwable ) );
}
private static class MySimpleFormatter extends Formatter {
Date dat = new Date();
//define the log time format
private final static String format = "{0,date} {0,time, long}";
private MessageFormat formatter;
private Object args[] = new Object[1];
/**
* Format the given LogRecord.
* @param record the log record to be formatted.
* @return a formatted log record
*/
@Override
public synchronized String format(LogRecord record)
{
StringBuffer sb = new StringBuffer();
// Minimize memory allocations here.
dat.setTime(record.getMillis());
args[0] = dat;
StringBuffer text = new StringBuffer();
if (formatter == null) {
formatter = new MessageFormat(format);
}
formatter.format(args, text, null);
sb.append(text);
sb.append(" ");
if (BUILD_SYSTEM_NAME != null)
{
sb.append("[");
sb.append(BUILD_SYSTEM_NAME);
sb.append("] ");
}
if (record.getSourceClassName() != null) {
sb.append(record.getSourceClassName());
} else {
sb.append(record.getLoggerName());
}
if (record.getSourceMethodName() != null) {
sb.append(" ");
sb.append(record.getSourceMethodName());
}
sb.append(SYSTEM_LINE_SEPARATOR);
String message = formatMessage(record);
sb.append(record.getLevel().getLocalizedName());
sb.append(": ");
sb.append(message);
return sb.toString();
}
}
}