Package org.eclipse.osgi.internal.profile

Source Code of org.eclipse.osgi.internal.profile.Profile

/*******************************************************************************
* 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);
  }
}
TOP

Related Classes of org.eclipse.osgi.internal.profile.Profile

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.