blob: b8c49cadfc5e42490c2537a6bbe5e783a42f8c5b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.osgi.internal.profile;
import org.eclipse.osgi.framework.debug.FrameworkDebugOptions;
import org.eclipse.osgi.framework.internal.core.FrameworkProperties;
/**
* This class is a development tool that provides a simple way to log
* programmer defined timmings for performance evaluations. This profiling
* allows logging of a timestamp with a corresponding message to a trace
* buffer.
*/
public class Profile {
/**
* Profiling is enabled and available.
*/
public static final boolean PROFILE = true; // enable profile compiling
/**
* The logging state of <tt>STARTUP</tt> messages
*/
public static boolean STARTUP = false; // enable startup profiling
/**
* The logging state of <tt>BENCHMARK</tt> messages
*/
public static boolean BENCHMARK = false; // enable all benchmarking
/**
* The logging state of <tt>DEBUG</tt> messages
*/
public static boolean DEBUG = false; // enable general debug profiling
private static final String OSGI_PROP = "osgi.profile."; //$NON-NLS-1$
private static final String PROP_STARTUP = OSGI_PROP + "startup"; //$NON-NLS-1$
private static final String PROP_BENCHMARK = OSGI_PROP + "benchmark"; //$NON-NLS-1$
private static final String PROP_DEBUG = OSGI_PROP + "debug"; //$NON-NLS-1$
private static final String PROP_IMPL = OSGI_PROP + "impl"; //$NON-NLS-1$
private static final String OSGI_OPTION = "org.eclipse.osgi/profile/"; //$NON-NLS-1$
private static final String OPTION_STARTUP = OSGI_OPTION + "startup"; //$NON-NLS-1$
private static final String OPTION_BENCHMARK = OSGI_OPTION + "benchmark"; //$NON-NLS-1$
private static final String OPTION_DEBUG = OSGI_OPTION + "debug"; //$NON-NLS-1$
private static final String OPTION_IMPL = OSGI_OPTION + "impl"; //$NON-NLS-1$
/**
* The default logging flag.
*/
public static final int FLAG_NONE = 0;
/**
* The logging flag for <strong>method enter</strong>
*/
public static final int FLAG_ENTER = 1;
/**
* The logging flag for <strong>method exit</strong>
*/
public static final int FLAG_EXIT = 2;
/**
* The description for <strong>method enter</strong>
*/
public static final String ENTER_DESCRIPTION = "enter"; //$NON-NLS-1$
/**
* The description for <strong>method exit</strong>
*/
public static final String EXIT_DESCRIPTION = "exit"; //$NON-NLS-1$
private static ProfileLogger profileLogger = null;
private static String profileLoggerClassName = null;
static {
initProps();
}
/**
* Initialize/update profiling properties.
*
* If profiling properties are updated, this method is called to update
* the profile states.
*/
public static void initProps() {
String prop;
FrameworkDebugOptions dbgOptions = null;
// if osgi.debug is not available, don't force DebugOptions
// to init as this variable may be set later on where
// DebugOptions will succeed.
if (FrameworkProperties.getProperty("osgi.debug") != null) { //$NON-NLS-1$
dbgOptions = FrameworkDebugOptions.getDefault();
if (dbgOptions != null) {
STARTUP = dbgOptions.getBooleanOption(OPTION_STARTUP, false);
BENCHMARK = dbgOptions.getBooleanOption(OPTION_BENCHMARK, false);
DEBUG = dbgOptions.getBooleanOption(OPTION_DEBUG, false);
if (profileLogger == null)
profileLoggerClassName = dbgOptions.getOption(OPTION_IMPL);
}
}
// System properties will always override anything in .options file
if ((prop = FrameworkProperties.getProperty(PROP_STARTUP)) != null) {
STARTUP = Boolean.valueOf(prop).booleanValue();
if (dbgOptions != null)
dbgOptions.setOption(OPTION_STARTUP, new Boolean(STARTUP).toString());
}
if ((prop = FrameworkProperties.getProperty(PROP_BENCHMARK)) != null) {
BENCHMARK = Boolean.valueOf(prop).booleanValue();
if (dbgOptions != null)
dbgOptions.setOption(OPTION_BENCHMARK, new Boolean(BENCHMARK).toString());
}
if ((prop = FrameworkProperties.getProperty(PROP_DEBUG)) != null) {
DEBUG = Boolean.valueOf(prop).booleanValue();
if (dbgOptions != null)
dbgOptions.setOption(OPTION_DEBUG, new Boolean(DEBUG).toString());
}
if (profileLogger == null) {
if ((prop = FrameworkProperties.getProperty(PROP_IMPL)) != null) {
profileLoggerClassName = prop;
if (dbgOptions != null)
dbgOptions.setOption(OPTION_IMPL, profileLoggerClassName);
}
} else {
profileLogger.initProps();
}
}
/**
* Log a method enter.
*
* @param id The method's unique identification (e.g. org.eclipse.class#name).
*/
public static void logEnter(String id) {
logTime(FLAG_ENTER, id, ENTER_DESCRIPTION, null);
}
/**
* Log a method enter.
*
* @param id The method's unique identification (e.g. org.eclipse.class#name).
* @param description A description of the method.
*/
public static void logEnter(String id, String description) {
logTime(FLAG_ENTER, id, ENTER_DESCRIPTION, description);
}
/**
* Log a method exit.
*
* @param id The method's unique identification (e.g. org.eclipse.class#name).
*/
public static void logExit(String id) {
logTime(FLAG_EXIT, id, EXIT_DESCRIPTION, null);
}
/**
* Log a method exit.
*
* @param id The method's unique identification (e.g. org.eclipse.class#name).
* @param description A description of the method.
*/
public static void logExit(String id, String description) {
logTime(FLAG_EXIT, id, EXIT_DESCRIPTION, description);
}
/**
* Log a message.
*
* @param id The method's unique identification (e.g. org.eclipse.class#name).
* @param msg The message.
*/
public static void logTime(String id, String msg) {
logTime(FLAG_NONE, id, msg, null);
}
/**
* Log a message.
*
* @param id The method's unique identification (e.g. org.eclipse.class#name).
* @param msg The message.
* @param description A description of the method.
*/
public static void logTime(String id, String msg, String description) {
logTime(FLAG_NONE, id, msg, description);
}
/**
* Log a message.
*
* @param flag A profile logging flag.
* @param id The method's unique identification (e.g. org.eclipse.class#name).
* @param msg The message.
* @param description A description of the method.
*
* @see #FLAG_ENTER
* @see #FLAG_EXIT
* @see #FLAG_NONE
*/
public static void logTime(int flag, String id, String msg, String description) {
if (profileLogger == null)
profileLogger = createProfileLogger();
profileLogger.logTime(flag, id, msg, description);
}
/**
* Use cumulative logging to record the entrance from this scope.
*
* @param scope The entering scope
*/
public static void accumLogEnter(String scope) {
if (profileLogger == null)
profileLogger = createProfileLogger();
profileLogger.accumLogEnter(scope);
}
/**
* Use cumulative logging to record the exit from this scope.
*
* @param scope The exiting scope
*/
public static void accumLogExit(String scope) {
if (profileLogger == null)
profileLogger = createProfileLogger();
profileLogger.accumLogExit(scope);
}
/**
* Get the profiling log report and reset the trace buffer.
*
* @return The profiling log report.
*/
public static String getProfileLog() {
if (profileLogger != null)
return profileLogger.getProfileLog();
return ""; //$NON-NLS-1$
}
/**
* Create an instance of the appropriate profile logger
*/
private static ProfileLogger createProfileLogger() {
ProfileLogger result = null;
// Try to create it by class name
if (profileLoggerClassName != null) {
Class profileImplClass = null;
try {
profileImplClass = Class.forName(profileLoggerClassName);
result = (ProfileLogger) profileImplClass.newInstance();
} catch (Exception e) {
// could not find the class
e.printStackTrace();
}
}
// Use the default
if (result == null)
result = new DefaultProfileLogger();
return (result);
}
}