diff --git a/rse/plugins/org.eclipse.rse.logging/HelpContexts.xml b/rse/plugins/org.eclipse.rse.logging/HelpContexts.xml index 44abfd5c409..b3c46def8db 100644 --- a/rse/plugins/org.eclipse.rse.logging/HelpContexts.xml +++ b/rse/plugins/org.eclipse.rse.logging/HelpContexts.xml @@ -12,15 +12,18 @@ Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson, Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. Contributors: -{Name} (company) - description of contribution. +Michael Berger (IBM Canada) - 148434 Better user assistance for logging preference page. --> - - - Settings for the logging of messages. - - + + +This is the RSE Logging preference page. +You can specify what severity of messages you wish to log - from informational messages, to warnings, to errors. +The debug setting provides the most detail. +Messages are logged to the .log file in the .metadata folder of the workspace. + + \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.logging/META-INF/MANIFEST.MF b/rse/plugins/org.eclipse.rse.logging/META-INF/MANIFEST.MF index 64c8e13e842..b4b50377adf 100644 --- a/rse/plugins/org.eclipse.rse.logging/META-INF/MANIFEST.MF +++ b/rse/plugins/org.eclipse.rse.logging/META-INF/MANIFEST.MF @@ -9,5 +9,6 @@ Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime Eclipse-LazyStart: true Export-Package: org.eclipse.rse.logging, - org.eclipse.rse.logging.performance + org.eclipse.rse.logging.performance, + org.eclipse.rse.logging.ui Bundle-Vendor: Eclipse.org diff --git a/rse/plugins/org.eclipse.rse.logging/build.properties b/rse/plugins/org.eclipse.rse.logging/build.properties index 7ec1cc0eea6..125d3f96f42 100644 --- a/rse/plugins/org.eclipse.rse.logging/build.properties +++ b/rse/plugins/org.eclipse.rse.logging/build.properties @@ -1,5 +1,4 @@ bin.includes = HelpContexts.xml,\ - RemoteSystemsLogging.properties,\ plugin.properties,\ plugin.xml,\ style/,\ diff --git a/rse/plugins/org.eclipse.rse.logging/plugin.xml b/rse/plugins/org.eclipse.rse.logging/plugin.xml index 0a291c6a8f3..4f743c2cecd 100644 --- a/rse/plugins/org.eclipse.rse.logging/plugin.xml +++ b/rse/plugins/org.eclipse.rse.logging/plugin.xml @@ -31,7 +31,7 @@ Contributors: - + diff --git a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/internal/logging/LoggerController.java b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/internal/logging/LoggerController.java deleted file mode 100644 index 5e66d53a317..00000000000 --- a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/internal/logging/LoggerController.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2002, 2006 IBM Corporation. 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 - * - * Initial Contributors: - * The following IBM employees contributed to the Remote System Explorer - * component that contains this file: David McKnight, Kushal Munir, - * Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson, - * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. - * - * Contributors: - * {Name} (company) - description of contribution. - ********************************************************************************/ - -package org.eclipse.rse.internal.logging; - -import java.util.Hashtable; - -import org.eclipse.core.runtime.Plugin; -import org.eclipse.rse.logging.Logger; - -public class LoggerController { - - private static Hashtable pluginTable = new Hashtable(); - - /** - * Return an previously cached Logger instance.
- * It will return null if no Logger instance has been created - * for this plugin before. - */ - public static Logger getInst(Plugin plugin) { - if (pluginTable.containsKey(plugin)) - return (Logger) pluginTable.get(plugin); - else - return null; - } - - public static void registerInst(Plugin plugin, Logger logger) { - pluginTable.put(plugin, logger); - return; - } - - public static void freeInst(Plugin plugin) { - // get cached instance if one exists. - Logger logger = getInst(plugin); - // no luck, this means we have an incorrect free, do nothing. - if (logger == null) - return; - logger.freeResources(); - pluginTable.remove(plugin); - return; - - } - -} \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/LoggingPreferenceInitializer.java b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/internal/logging/LoggingPreferenceInitializer.java similarity index 63% rename from rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/LoggingPreferenceInitializer.java rename to rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/internal/logging/LoggingPreferenceInitializer.java index ff06d0c574d..20d1ce88335 100644 --- a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/LoggingPreferenceInitializer.java +++ b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/internal/logging/LoggingPreferenceInitializer.java @@ -14,26 +14,30 @@ * {Name} (company) - description of contribution. ********************************************************************************/ -package org.eclipse.rse.logging; +package org.eclipse.rse.internal.logging; +import org.eclipse.core.runtime.Preferences; import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer; +import org.eclipse.rse.logging.IRemoteSystemsLogging; +import org.eclipse.rse.logging.RemoteSystemsLoggingPlugin; /** * This class initializes logging preferences. */ public class LoggingPreferenceInitializer extends AbstractPreferenceInitializer { - /** - * Constructor. - */ - public LoggingPreferenceInitializer() { - super(); - } + /** + * Constructor. + */ + public LoggingPreferenceInitializer() { + super(); + } - /** - * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences() - */ - public void initializeDefaultPreferences() { - RemoteSystemsLoggingPlugin.getDefault().initializeDefaultPreferences(); - } + /** + * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences() + */ + public void initializeDefaultPreferences() { + Preferences prefs = RemoteSystemsLoggingPlugin.getDefault().getPluginPreferences(); + prefs.setDefault(IRemoteSystemsLogging.DEBUG_LEVEL, IRemoteSystemsLogging.LOG_ERROR); + } } \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/Activator.java b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/Activator.java deleted file mode 100644 index 4f9eaa3bd8a..00000000000 --- a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/Activator.java +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2006 IBM Corporation. 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 - * - * Initial Contributors: - * The following IBM employees contributed to the Remote System Explorer - * component that contains this file: David McKnight, Kushal Munir, - * Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson, - * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. - * - * Contributors: - * {Name} (company) - description of contribution. - ********************************************************************************/ - -package org.eclipse.rse.logging; - -import org.eclipse.core.runtime.Plugin; -import org.osgi.framework.BundleContext; - -/** - * The main plugin class to be used in the desktop. - */ -public class Activator extends Plugin { - - //The shared instance. - private static Activator plugin; - - /** - * The constructor. - */ - public Activator() { - plugin = this; - } - - /** - * This method is called upon plug-in activation - */ - public void start(BundleContext context) throws Exception { - super.start(context); - } - - /** - * This method is called when the plug-in is stopped - */ - public void stop(BundleContext context) throws Exception { - super.stop(context); - plugin = null; - } - - /** - * Returns the shared instance. - */ - public static Activator getDefault() { - return plugin; - } - -} \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/IRemoteSystemsLogging.java b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/IRemoteSystemsLogging.java index 44e19560d5f..ae4d3f32de0 100644 --- a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/IRemoteSystemsLogging.java +++ b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/IRemoteSystemsLogging.java @@ -21,59 +21,39 @@ package org.eclipse.rse.logging; */ public interface IRemoteSystemsLogging { - - // All attributes here are static final. /** * Name of the key that controls the logging level.
*/ - String PLUGIN_ID = "org.eclipse.rse.logging"; + public static final String PLUGIN_ID = "org.eclipse.rse.logging"; /** * Name of the key that controls the logging level.
* (value is "debug_level"). */ - String DEBUG_LEVEL = "debug_level"; - - /** - * Name of the key that controls the log location.
- * (value is "log_location"). - */ - String LOG_LOCATION = "log_location"; + public static final String DEBUG_LEVEL = "debug_level"; /** * Set debug_level to this value to get Error messages.
* (value is 0). */ - int LOG_ERROR = 0; + public static final int LOG_ERROR = 0; /** * Set debug_level to this value to get Warning messages.
* (value is 1). */ - int LOG_WARNING = 1; + public static final int LOG_WARNING = 1; /** * Set debug_level to this value to get Information messages.
* (value is 2). */ - int LOG_INFO = 2; + public static final int LOG_INFO = 2; /** * Set debug_level to this value to get Debug messages.
* (value is 3). */ - int LOG_DEBUG = 3; - - /** - * Set log_location to this value to log to a file.
- * (value is "Log_To_File"). - */ - String LOG_TO_FILE = "Log_To_File"; - - /** - * Set log_location to this value to log to a Std out.
- * (value is "Log_To_StdOut"). - */ - String LOG_TO_STDOUT = "Log_To_StdOut"; + public static final int LOG_DEBUG = 3; } \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/Logger.java b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/Logger.java index 3cf0f6522a4..6ab0e701917 100644 --- a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/Logger.java +++ b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/Logger.java @@ -19,15 +19,11 @@ package org.eclipse.rse.logging; import org.eclipse.core.runtime.ILog; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; -import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Plugin; import org.eclipse.core.runtime.Preferences; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Preferences.IPropertyChangeListener; import org.eclipse.core.runtime.Preferences.PropertyChangeEvent; -import org.eclipse.rse.internal.logging.RemoteSystemLogListener; -import org.osgi.framework.Bundle; - /** * Generic Logger class for handling Remote Systems logging and tracing.
@@ -59,10 +55,9 @@ import org.osgi.framework.Bundle; * out.logInfo("loading myPlugin class.");
* //out.logWarning("This is a warning message.");
* //out.logError("This is an error.", new Exception());
- * //if (Logger.DEBUG)
- * // out.logDebugMessage(
- * // "myPlugin",
- * // "this is a debug message from class myPlugin.");
+ * //out.logDebugMessage(
+ * // "myPlugin",
+ * // "this is a debug message from class myPlugin.");
* ......
* ......
* }
@@ -77,70 +72,42 @@ import org.osgi.framework.Bundle; */ public class Logger implements IPropertyChangeListener { - public static final String Copyright = - "(C) Copyright IBM Corp. 2002, 2003. All Rights Reserved."; - - /** - * This SHOULD be set to false in production.
- * Used to compile out developement debug messages.
- */ - public final static boolean DEBUG = false; - - // Cashed workbenchPlugin Log, LogListener instances private ILog systemsPluginLog = null; private RemoteSystemLogListener logListener = null; - - // Cashed Plugin ID, and plugin private String pluginId = null; - Plugin systemPlugin = null; + private Plugin systemPlugin = null; + private int debug_level = IRemoteSystemsLogging.LOG_ERROR; - // Controls logging level - private int debug_level = 0; - - // Captures initialization errors - private boolean init_ok = true; - - protected Logger(Plugin systemPlugin) { + /** + * Creates a new Logger. Invoked by the LoggerFactory. + * @param systemPlugin The preferences for this plugin will determine the detail + * logged by this logger. This allows different levels of detail to be logged in the + * workbench. + * @see LoggerFactory#getInst(Plugin); + */ + Logger(Plugin systemPlugin) { this.systemPlugin = systemPlugin; this.pluginId = systemPlugin.getBundle().getSymbolicName(); initialize(); } + /** + * Initialize the Logger. The logger uses an ILog from the platform for this particular plugin, and + * establishes a listener on that log to format the items placed in the log. + */ private void initialize() { - try { - - systemsPluginLog = systemPlugin.getLog(); - if (logListener == null) - logListener = new RemoteSystemLogListener(systemPlugin); - systemsPluginLog.addLogListener(logListener); - - // get the debug level from plugin Preference store. - // note: logListener must be initialized before calling getPreference store! - Preferences store = systemPlugin.getPluginPreferences(); - debug_level = store.getInt(IRemoteSystemsLogging.DEBUG_LEVEL); - - store.addPropertyChangeListener(this); - store.addPropertyChangeListener(logListener); - - } catch (Exception e) { - // Errors occured during initialize, disable logging. - // should never be here. Use Platform logger instead. - Bundle bundle = Platform.getBundle(Platform.PI_RUNTIME); - Platform.getLog(bundle).log( - new Status( - IStatus.ERROR, - IRemoteSystemsLogging.PLUGIN_ID, - IStatus.OK, - "could not create Logger for " + pluginId, - e)); - init_ok = false; - } + systemsPluginLog = systemPlugin.getLog(); + logListener = new RemoteSystemLogListener(systemPlugin); + systemsPluginLog.addLogListener(logListener); + Preferences store = systemPlugin.getPluginPreferences(); + debug_level = store.getInt(IRemoteSystemsLogging.DEBUG_LEVEL); + store.addPropertyChangeListener(this); + store.addPropertyChangeListener(logListener); } /** - * Log a Debug message. This is intended to be wrapped as follows:
- * if (Logger.DEBUG)
- * Logger.logDebugMessage("someClassName", "someMessage");
+ * Log a Debug message. This is intended to be used as follows:
+ * Logger.logDebugMessage("someClassName", "someMessage");
*
* and the output will be:
*
@@ -153,16 +120,10 @@ public class Logger implements IPropertyChangeListener { * Note that since this message is only for developer debugging, it does not * need to be localized to proper local.
*/ - - public synchronized void logDebugMessage( - String className, - String message) { - if ((init_ok) && (debug_level >= IRemoteSystemsLogging.LOG_DEBUG)) { - // ie: print all INFO, WARNING and ERROR messages - MultiStatus debugStatus = - new MultiStatus(pluginId, IStatus.OK, className, null); - Status infoStatus = - new Status(IStatus.OK, pluginId, IStatus.OK, message, null); + public synchronized void logDebugMessage(String className, String message) { + if (debug_level >= IRemoteSystemsLogging.LOG_DEBUG) { + MultiStatus debugStatus = new MultiStatus(pluginId, IStatus.OK, className, null); + Status infoStatus = new Status(IStatus.OK, pluginId, IStatus.OK, message, null); debugStatus.add(infoStatus); systemsPluginLog.log(debugStatus); } @@ -173,16 +134,11 @@ public class Logger implements IPropertyChangeListener { * be localized to proper local.
* ie: Resource.getString() should already have been called */ - public synchronized void logError(String message, Throwable ex) { - if ((init_ok) && (debug_level >= IRemoteSystemsLogging.LOG_ERROR)) { - // ie: print only ERROR messages - if (message == null) - message = ""; - Status errorStatus = - new Status(IStatus.ERROR, pluginId, IStatus.OK, message, ex); + if (debug_level >= IRemoteSystemsLogging.LOG_ERROR) { + if (message == null) message = ""; + Status errorStatus = new Status(IStatus.ERROR, pluginId, IStatus.OK, message, ex); systemsPluginLog.log(errorStatus); - } } @@ -191,28 +147,21 @@ public class Logger implements IPropertyChangeListener { * be localized to proper local.
* ie: Resource.getString() should already have been called */ - public synchronized void logInfo(String message) - { + public synchronized void logInfo(String message) { logInfo(message, null); } - + /** * Log an Information message. Note that the message should already * be localized to proper local.
* ie: Resource.getString() should already have been called */ - public synchronized void logInfo(String message, Throwable ex) { - if ((init_ok) && (debug_level >= IRemoteSystemsLogging.LOG_INFO)) { - if (message == null) - message = ""; - // ie: print all INFO, WARNING and ERROR messages - Status infoStatus = - new Status(IStatus.INFO, pluginId, IStatus.OK, message, ex); + if (debug_level >= IRemoteSystemsLogging.LOG_INFO) { + if (message == null) message = ""; + Status infoStatus = new Status(IStatus.INFO, pluginId, IStatus.OK, message, ex); systemsPluginLog.log(infoStatus); - } - } /** @@ -220,8 +169,7 @@ public class Logger implements IPropertyChangeListener { * be localized to proper local.
* ie: Resource.getString() should already have been called */ - public synchronized void logWarning(String message) - { + public synchronized void logWarning(String message) { logWarning(message, null); } @@ -231,26 +179,17 @@ public class Logger implements IPropertyChangeListener { * ie: Resource.getString() should already have been called */ public synchronized void logWarning(String message, Throwable ex) { - if ((init_ok) && (debug_level >= IRemoteSystemsLogging.LOG_WARNING)) { - if (message == null) - message = ""; - // ie: print all WARNING and ERROR messages - Status warningStatus = - new Status( - IStatus.WARNING, - pluginId, - IStatus.OK, - message, - ex); + if (debug_level >= IRemoteSystemsLogging.LOG_WARNING) { + if (message == null) message = ""; + Status warningStatus = new Status(IStatus.WARNING, pluginId, IStatus.OK, message, ex); systemsPluginLog.log(warningStatus); } - } public synchronized void setDebugLevel(int level) { debug_level = level; } - + public synchronized int getDebugLevel() { return debug_level; } @@ -260,10 +199,9 @@ public class Logger implements IPropertyChangeListener { } /** - * Handle changes from Preferences page. + * Handle changes from a Preferences page. */ public synchronized void propertyChange(PropertyChangeEvent event) { - // refresh the debug level from plugin Preference store Preferences prefs = systemPlugin.getPluginPreferences(); debug_level = prefs.getInt(IRemoteSystemsLogging.DEBUG_LEVEL); } diff --git a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/LoggerFactory.java b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/LoggerFactory.java index f2e6d248dcd..4ed32d2c7eb 100644 --- a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/LoggerFactory.java +++ b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/LoggerFactory.java @@ -16,8 +16,8 @@ package org.eclipse.rse.logging; +import java.util.Hashtable; import org.eclipse.core.runtime.Plugin; -import org.eclipse.rse.internal.logging.LoggerController; /** * Factory class for creating Logger instances.
@@ -27,39 +27,31 @@ import org.eclipse.rse.internal.logging.LoggerController; */ public class LoggerFactory { + private static Hashtable pluginTable = new Hashtable(); /** - * Returns a Logger instance for the given plugin.
Note that there is only - * a singelton instance of the Logger class per plugin. You are guarenteed the - * same instance if one has previously been created. + * Returns the Logger instance for a given plugin. There is only + * one instance of the Logger class per plugin. */ - public static Logger getInst(Plugin plugin) { - - // get cached instance from controller if one exists. - Logger inst = LoggerController.getInst(plugin); - // no luck, create it and register it with the controller, and create - // preference page. - if (inst == null) { - inst = new Logger(plugin); - LoggerController.registerInst(plugin, inst); - // Check to see if the Logging plugin out instance has been created yet. - // If it has, use it to log - if (RemoteSystemsLoggingPlugin.out != null) - RemoteSystemsLoggingPlugin.out.logInfo( - "Created Logger instance for " - + plugin.getBundle().getSymbolicName()); + public static Logger getLogger(Plugin plugin) { + Logger logger = (Logger) pluginTable.get(plugin); + if (logger == null) { + logger = new Logger(plugin); + pluginTable.put(plugin, logger); } - - return inst; + return logger; } /** - * Frees resources used by the Logger instance for the given plugin.
- * This methods must be called as part of the the plugin shutdown life cycle. - */ - public static void freeInst(Plugin plugin) { - // delegate to controller - LoggerController.freeInst(plugin); + * Frees resources used by the Logger instance for the given plugin.
+ * This methods must be called as part of the the plugin shutdown life cycle. + */ + public static void freeLogger(Plugin plugin) { + Logger logger = (Logger) pluginTable.get(plugin); + if (logger != null) { + logger.freeResources(); + pluginTable.remove(plugin); + } } } \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/internal/logging/RemoteSystemLogListener.java b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/RemoteSystemLogListener.java similarity index 69% rename from rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/internal/logging/RemoteSystemLogListener.java rename to rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/RemoteSystemLogListener.java index ab09585cc3c..bbd335999c3 100644 --- a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/internal/logging/RemoteSystemLogListener.java +++ b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/RemoteSystemLogListener.java @@ -14,7 +14,7 @@ * {Name} (company) - description of contribution. ********************************************************************************/ -package org.eclipse.rse.internal.logging; +package org.eclipse.rse.logging; import java.io.BufferedWriter; import java.io.File; @@ -26,27 +26,22 @@ import org.eclipse.core.runtime.ILogListener; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Plugin; -import org.eclipse.core.runtime.Preferences; import org.eclipse.core.runtime.Preferences.IPropertyChangeListener; import org.eclipse.core.runtime.Preferences.PropertyChangeEvent; -import org.eclipse.rse.logging.IRemoteSystemsLogging; /** * Log Listener is a sink for messages coming from Logger. */ -public class RemoteSystemLogListener implements ILogListener, IPropertyChangeListener { +class RemoteSystemLogListener implements ILogListener, IPropertyChangeListener { private PrintWriter log = null; private File outputFile = null; - private boolean log_to_stdout = false; - private Plugin plugin = null; /** * Create a new log listener for a plugin. * @param plugin The plugin for which to create a log listener. */ public RemoteSystemLogListener(Plugin plugin) { - this.plugin = plugin; IPath path = plugin.getStateLocation().addTrailingSeparator().append(".log"); outputFile = path.toFile(); if ((outputFile != null) && (outputFile.exists())) { @@ -61,13 +56,8 @@ public class RemoteSystemLogListener implements ILogListener, IPropertyChangeLis */ private void initialize() { try { - Preferences store = plugin.getPluginPreferences(); - String log_location = store.getString(IRemoteSystemsLogging.LOG_LOCATION); - if ((log_location != null) && (log_location.equalsIgnoreCase(IRemoteSystemsLogging.LOG_TO_STDOUT))) { - doLogToView(); - } else { - doLogToFile(); - } + freeResources(); + log = new PrintWriter(new BufferedWriter(new FileWriter(outputFile.toString(), true)), true); } catch (Exception e) { log = null; System.err.println("Exception in RemoteSystemLogListener.initialize(): " + e.getMessage()); @@ -75,35 +65,11 @@ public class RemoteSystemLogListener implements ILogListener, IPropertyChangeLis } } - /** - * Logs to standard output. - */ - private void doLogToView() { - // make sure we free resources first - freeResources(); - // log - log = new PrintWriter(System.out, true); - // cach last state - log_to_stdout = true; - } - - private void doLogToFile() throws Exception { - // make sure we free resources first - freeResources(); - // log - log = - new PrintWriter( - new BufferedWriter(new FileWriter(outputFile.toString(), true)), - true); - // cache last state - log_to_stdout = false; - } - public void logging(IStatus status) { if (log == null) return; else { - // Need a to string here, because we need to be able to compate dates. + // Need a to string here, because we need to be able to compare dates. String date = new Date().toString(); log.println(date); int severity = status.getSeverity(); @@ -119,17 +85,14 @@ public class RemoteSystemLogListener implements ILogListener, IPropertyChangeLis log.print(" "); log.print(status.getPlugin()); - // removed for now because we do not use Error codes. - //log.print(" "); - //log.print(status.getCode()); log.print(" "); log.println(status.getMessage()); - if (status.getException() != null) - status.getException().printStackTrace(log); + if (status.getException() != null) status.getException().printStackTrace(log); if (status.isMultiStatus()) { IStatus[] children = status.getChildren(); - for (int i = 0; i < children.length; i++) + for (int i = 0; i < children.length; i++) { loggingChild(children[i]); + } } log.println("--------------------------------------------"); } @@ -149,8 +112,7 @@ public class RemoteSystemLogListener implements ILogListener, IPropertyChangeLis else { log.print("\t\t"); log.println(status.getMessage()); - if (status.getException() != null) - status.getException().printStackTrace(log); + if (status.getException() != null) status.getException().printStackTrace(log); if (status.isMultiStatus()) { IStatus[] children = status.getChildren(); for (int i = 0; i < children.length; i++) @@ -168,14 +130,7 @@ public class RemoteSystemLogListener implements ILogListener, IPropertyChangeLis } public void freeResources() { - if (log == null) - return; - - // make sure to not close std_out. A closed stream can *not* - // br re-opened! - if (log_to_stdout) - return; - + if (log == null) return; log.flush(); log.close(); log = null; diff --git a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/RemoteSystemsLoggingPlugin.java b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/RemoteSystemsLoggingPlugin.java index 81eee3703ed..9f488e13b9e 100644 --- a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/RemoteSystemsLoggingPlugin.java +++ b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/RemoteSystemsLoggingPlugin.java @@ -24,23 +24,15 @@ import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Plugin; -import org.eclipse.core.runtime.Preferences; import org.osgi.framework.BundleContext; - /** * Remote Systems Logging plugin. */ public class RemoteSystemsLoggingPlugin extends Plugin { - - //The shared instance. - private static RemoteSystemsLoggingPlugin inst; - - //Resource bundle. + private static RemoteSystemsLoggingPlugin singleton; private ResourceBundle resourceBundle; - - // The cached Logger inst. public static Logger out = null; /** @@ -48,17 +40,14 @@ public class RemoteSystemsLoggingPlugin extends Plugin { */ public RemoteSystemsLoggingPlugin() { super(); - - if (inst == null) { - inst = this; - } + singleton = this; } /** * Returns the shared plugin instance. */ public static RemoteSystemsLoggingPlugin getDefault() { - return inst; + return singleton; } /** @@ -79,47 +68,33 @@ public class RemoteSystemsLoggingPlugin extends Plugin { * Returns the plugin's resource bundle. */ public ResourceBundle getResourceBundle() { - - if (resourceBundle == null) { - - try { - IPath path = new Path("$nl$/RemoteSystemsLogging.properties"); - URL url = FileLocator.find(getBundle(), path, null); - resourceBundle = new PropertyResourceBundle(url.openStream()); - } catch (Exception x) { - resourceBundle = null; - out.logInfo("RemoteSystemsLoggingPlugin - unable to log resourcebundle"); - } - } - + if (resourceBundle == null) { + try { + IPath path = new Path("$nl$/RemoteSystemsLogging.properties"); + URL url = FileLocator.find(getBundle(), path, null); + resourceBundle = new PropertyResourceBundle(url.openStream()); + } catch (Exception x) { + resourceBundle = null; + out.logInfo("RemoteSystemsLoggingPlugin - unable to log resourcebundle"); + } + } return resourceBundle; } - /** - * Sets default preference values. + /* (non-Javadoc) + * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext) */ - public void initializeDefaultPreferences() { - Preferences prefs = getPluginPreferences(); - prefs.setDefault(IRemoteSystemsLogging.DEBUG_LEVEL, IRemoteSystemsLogging.LOG_ERROR); - prefs.setDefault(IRemoteSystemsLogging.LOG_LOCATION, IRemoteSystemsLogging.LOG_TO_FILE); + public void start(BundleContext context) throws Exception { + super.start(context); + out = LoggerFactory.getLogger(this); + out.logInfo("loading RemoteSystemsLoggingPlugin class."); } - /** - * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) - */ - public void start(BundleContext context) throws Exception { - super.start(context); - - // don't need a preference page for this plugin. - out = LoggerFactory.getInst(this); - out.logInfo("loading RemoteSystemsLoggingPlugin class."); - } - - /** - * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) - */ - public void stop(BundleContext context) throws Exception { - LoggerFactory.freeInst(this); - super.stop(context); - } + /* (non-Javadoc) + * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + LoggerFactory.freeLogger(this); + super.stop(context); + } } \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/performance/PerformanceLogger.java b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/performance/PerformanceLogger.java index a4e58fad24c..2413a4a8a33 100644 --- a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/performance/PerformanceLogger.java +++ b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/performance/PerformanceLogger.java @@ -46,672 +46,674 @@ import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; - /** -* A performance measurement class for benchmarking. -* This performance framework provides stopwatch functions -* for calculating elapsed time for an operation. -* -* Usuage example -* Method_A { -* String key = PerformanceLogger.register("RSE","WDSC","5120"); -* PerformanceLogger.start(key, "OP1"); //CallerID is OP1 -* Method_B(); -* PerformanceLogger.stop(key); -* } -* -* Method_B { -* PerformanceLogger.start("RSE"); //"RSE" component, CalleID="class.method" -* // Do something -* PerformanceLogger.stop("RSE"); -* } -* -* Method_C { -* PerformanceLogger.start(); //Use the default component for recording -* // Do something -* PerformanceLogger.stop(); -* } -*/ + * A performance measurement class for benchmarking. + * This performance framework provides stopwatch functions + * for calculating elapsed time for an operation. + * + * Usuage example + * Method_A { + * String key = PerformanceLogger.register("RSE","WDSC","5120"); + * PerformanceLogger.start(key, "OP1"); //CallerID is OP1 + * Method_B(); + * PerformanceLogger.stop(key); + * } + * + * Method_B { + * PerformanceLogger.start("RSE"); //"RSE" component, CalleID="class.method" + * // Do something + * PerformanceLogger.stop("RSE"); + * } + * + * Method_C { + * PerformanceLogger.start(); //Use the default component for recording + * // Do something + * PerformanceLogger.stop(); + * } + */ -public class PerformanceLogger -{ - - public final static boolean _ENABLE_PERFORMANCE_LOGGING_IBM_INTERNAL_ = false; +public class PerformanceLogger { - public final static int OPTION_GET_ALL = 1; - public final static int OPTION_GET_FEATURE = 2; - public final static int OPTION_GET_VERSION = 3; - - - - final static String ELEMENT_TASK = "Task"; - final static String ATTRIBUTE_NAME_TASKID = "CallerID"; - final static String DEFAULT_COMPONENT = "_PERFORMANCELOGGER_"; - - static boolean ENABLE_PERFORMANCE_LOGGING = false; /*for user logging enabling*/ - //static long currentAssignedID = -1; - static long samplingTime = -1; /* Elapsed time for normalization operatin */ - static boolean _initialized = false; - static HashMap perfLogRegistry = new HashMap(); + public final static boolean _ENABLE_PERFORMANCE_LOGGING_IBM_INTERNAL_ = false; - /* - * Static initializer to normalize this logger. - */ - static { - normalize(); + public final static int OPTION_GET_ALL = 1; + + public final static int OPTION_GET_FEATURE = 2; + + public final static int OPTION_GET_VERSION = 3; + + final static String ELEMENT_TASK = "Task"; + + final static String ATTRIBUTE_NAME_TASKID = "CallerID"; + + final static String DEFAULT_COMPONENT = "_PERFORMANCELOGGER_"; + + static boolean ENABLE_PERFORMANCE_LOGGING = false; /*for user logging enabling*/ + + //static long currentAssignedID = -1; + static long samplingTime = -1; /* Elapsed time for normalization operatin */ + + static boolean _initialized = false; + + static HashMap perfLogRegistry = new HashMap(); + + /* + * Static initializer to normalize this logger. + */ + static { + normalize(); + } + + static class StartData { + long startTime = -1; + + long stopTime = -1; + + String userID = null; + + String startThread = null; + + String startMethod = null; + + String stopThread = null; + + String stopMethod = null; + + Element node = null; + } + + class ComponentData { + String component = null; + + String timeStamp = null; + + String feature = null; + + String version = null; + + String XMLFileID = null; + + File XMLFile = null; + + Document doc = null; + + Stack taskStack = new Stack(); + + ComponentData(String comp_id) { + component = comp_id; } - - static class StartData - { - long startTime = -1; - long stopTime = -1; - String userID = null; - String startThread = null; - String startMethod = null; - String stopThread = null; - String stopMethod = null; - Element node = null; - } - class ComponentData - { - String component = null; - String timeStamp = null; - String feature = null; - String version = null; - String XMLFileID = null; - File XMLFile = null; - Document doc = null; - Stack taskStack = new Stack(); - ComponentData(String comp_id) { - component = comp_id; - } - } - - /** - * public static void enablePerformanceLogging(boolean enable) : enable performance logging - * @param - * enable : true or false - * @return - * The flag ENABLE_PERFORMANCE_LOGGING is enable(true or false) - */ - public static void enablePerformanceLogging(boolean enable){ - if (enable) - ENABLE_PERFORMANCE_LOGGING = true; - else - ENABLE_PERFORMANCE_LOGGING = false; - } - - /** - * public static boolean isPerformanceLoggingEnabled() : check if logging enabled - * @return - * boolean ENABLE_PERFORMANCE_LOGGING - */ - public static boolean isPerformanceLoggingEnabled(){ - return ENABLE_PERFORMANCE_LOGGING; - } - - /* public static String register(String comp_id) : registering a component using default - * @parm - * - comp_id: Component to be registered - * @return - * compont comp_id registered with no product info - */ - public static String register(String comp_id) { - return register(comp_id,"",""); - } - - /* public static String register(String feature, String version) : method for registering a component using default - * @parm - * - feature: Identifier for Product Feature attribute in XML - * - version: Identifier for Product Version attribute in XML - * @return - * - return default component key - * - Default component XML file created - * - */ - public static String register(String feature, String version) { - return register(DEFAULT_COMPONENT,feature,version); - } - - /** - * public static String register(String comp_id, String feature, String version) : Registering a component - * @parm - * - comp_id: Component to be registered - * - feature: Identifier for Product Feature attribute in XML - * - version: Identifier for Product Version attribute in XML - * @return - * - comp_id as the registered key - * - An XML file is created by concatenating comp_id, feature and version with time stamp appended - */ - public static String register(String comp_id, String feature, String version){ - - if ( (comp_id == null) || (comp_id.length() == 0) ) { - System.out.println("PerformanceLogger:register(): Cannot register null component id."); - return comp_id; - } - - if (perfLogRegistry.containsKey(comp_id)) { - System.out.println("PerformanceLogger:register(): component \"" + comp_id + "\" already registered"); - return comp_id; - } - - ComponentData compData = new PerformanceLogger().new ComponentData(comp_id); - - Calendar time = Calendar.getInstance(); - compData.timeStamp = time.getTime().toString(); - String userID = System.getProperty("user.name"); - compData.XMLFileID = comp_id+"_" + userID + "_" + feature.replace(' ', '_') + "_"+version.replace(' ', '_') + "_perf." + compData.timeStamp.replace(' ', '_').replace(':', '_') + ".xml"; - compData.XMLFile = new File(compData.XMLFileID); - compData.feature = feature; - compData.version = version; - generateXMLFile(compData); - compData.taskStack = new Stack(); - perfLogRegistry.put(comp_id, compData); - _initialized = true; - System.out.println("SystemPerformanceLogger: XML file created is \"" + compData.XMLFile.getAbsolutePath() + "\"."); + } + + /** + * public static void enablePerformanceLogging(boolean enable) : enable performance logging + * @param + * enable : true or false + * @return + * The flag ENABLE_PERFORMANCE_LOGGING is enable(true or false) + */ + public static void enablePerformanceLogging(boolean enable) { + if (enable) + ENABLE_PERFORMANCE_LOGGING = true; + else + ENABLE_PERFORMANCE_LOGGING = false; + } + + /** + * public static boolean isPerformanceLoggingEnabled() : check if logging enabled + * @return + * boolean ENABLE_PERFORMANCE_LOGGING + */ + public static boolean isPerformanceLoggingEnabled() { + return ENABLE_PERFORMANCE_LOGGING; + } + + /* public static String register(String comp_id) : registering a component using default + * @parm + * - comp_id: Component to be registered + * @return + * compont comp_id registered with no product info + */ + public static String register(String comp_id) { + return register(comp_id, "", ""); + } + + /* public static String register(String feature, String version) : method for registering a component using default + * @parm + * - feature: Identifier for Product Feature attribute in XML + * - version: Identifier for Product Version attribute in XML + * @return + * - return default component key + * - Default component XML file created + * + */ + public static String register(String feature, String version) { + return register(DEFAULT_COMPONENT, feature, version); + } + + /** + * public static String register(String comp_id, String feature, String version) : Registering a component + * @parm + * - comp_id: Component to be registered + * - feature: Identifier for Product Feature attribute in XML + * - version: Identifier for Product Version attribute in XML + * @return + * - comp_id as the registered key + * - An XML file is created by concatenating comp_id, feature and version with time stamp appended + */ + public static String register(String comp_id, String feature, String version) { + + if ((comp_id == null) || (comp_id.length() == 0)) { + System.out.println("PerformanceLogger:register(): Cannot register null component id."); return comp_id; } - /** - * public static void deRegister(): De-register the default component - * @return - * Default component "_PERFORMANCELOGGER_" removed - * start() will be disabled + if (perfLogRegistry.containsKey(comp_id)) { + System.out.println("PerformanceLogger:register(): component \"" + comp_id + "\" already registered"); + return comp_id; + } + + ComponentData compData = new PerformanceLogger().new ComponentData(comp_id); + + Calendar time = Calendar.getInstance(); + compData.timeStamp = time.getTime().toString(); + String userID = System.getProperty("user.name"); + compData.XMLFileID = comp_id + "_" + userID + "_" + feature.replace(' ', '_') + "_" + version.replace(' ', '_') + "_perf." + compData.timeStamp.replace(' ', '_').replace(':', '_') + ".xml"; + compData.XMLFile = new File(compData.XMLFileID); + compData.feature = feature; + compData.version = version; + generateXMLFile(compData); + compData.taskStack = new Stack(); + perfLogRegistry.put(comp_id, compData); + _initialized = true; + System.out.println("SystemPerformanceLogger: XML file created is \"" + compData.XMLFile.getAbsolutePath() + "\"."); + return comp_id; + } + + /** + * public static void deRegister(): De-register the default component + * @return + * Default component "_PERFORMANCELOGGER_" removed + * start() will be disabled + */ + public static void deRegister() { + perfLogRegistry.remove(DEFAULT_COMPONENT); + System.out.println("SystemPerformanceLogger: default component de-registered"); + } + + /** + * public static void deRegister(String key): De-register a component + * @parm + * key : component to be removed + * @return + * component identified by key removed + * start(comp_id) will be disabled + */ + public static void deRegister(String key) { + perfLogRegistry.remove(key); + System.out.println("SystemPerformanceLogger: component \"" + key + "\" de-registered"); + } + + /** + * Set the normalization unit for this run.based on a standard method for class instance initialization. + * @return a string containing the unit. + */ + public static String normalize() { + /* + * Execute some standard code and time it to generate our normalization interval. + * Return the value to attempt to make it is not optimized by the compiler. */ - public static void deRegister() { - perfLogRegistry.remove(DEFAULT_COMPONENT); - System.out.println("SystemPerformanceLogger: default component de-registered"); - } - - /** - * public static void deRegister(String key): De-register a component - * @parm - * key : component to be removed - * @return - * component identified by key removed - * start(comp_id) will be disabled + long startTime = System.currentTimeMillis(); + Double q = null; + int i = 0; + int n = 1000000; + for (i = 0; i < n; i++) { + Double dd = new Double(n); + Double dr = new Double(n + i); + q = new Double(dd.doubleValue() / dr.doubleValue()); + } + double val = q.doubleValue() / i; + long stopTime = System.currentTimeMillis(); + samplingTime = stopTime - startTime; + String result = "SystemPerformanceLogger::Normalization Elapsed time = " + samplingTime + " " + val; + return result; + } + + /** + * public static long start(): start timer using default component + * The Task values will be recorded in the default component XML file + * @return + * - started time milliseconds + */ + public static long start() { + if (_initialized == false) { + register(DEFAULT_COMPONENT, "", ""); + } + /*Use the class method name for CallerID*/ + /* + * Sample method name retruned by getMethodName(): + * " com.ibm.etools.iseries.core.resources.ISeriesEditableSrcPhysicalFileMember.doDownload(ISeriesEditableSrcPhysicalFileMember.java:558)" + * */ - public static void deRegister(String key) { - perfLogRegistry.remove(key); - System.out.println("SystemPerformanceLogger: component \"" + key + "\" de-registered"); - } + String methodPath = getMethodName(true); - /** - * Set the normalization unit for this run.based on a standard method for class instance initialization. - * @return a string containing the unit. + return start(DEFAULT_COMPONENT, methodPath); + } + + /** + * public static long start(String comp_id): start timer for component comp_id using default TaskID + * @parm : + * comp_id : component registered previously by register(comp_id,..) + * @return + * - started time in milliseconds. + */ + public static long start(String comp_id) { + String methodPath = getMethodName(true); + return start(comp_id, methodPath); + + } + + /** + * public long start(String comp_id, String call_id): start the timer for registered component comp_id + * @parm + * comp_id is the registered component + * call_id is the "CallID" attribute value for the XML tag "Task" + * @return + * - started time in milliseconds. + */ + public static long start(String comp_id, String call_id) { + + if (perfLogRegistry.containsKey(comp_id) == false) { + System.out.println("PerformanceLogger:start(): component \"" + comp_id + "\" not registered"); + return -1; + } + + ComponentData cd = (ComponentData) perfLogRegistry.get(comp_id); + StartData td = new StartData(); + + td.userID = call_id; + td.startThread = Thread.currentThread().toString(); + td.startMethod = getMethodName(false); + + /* Create the new Task Element in the DOC */ + try { + + //BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(cd.XMLFile), "UTF8")); + Element root = cd.doc.getDocumentElement(); + Element task = cd.doc.createElement(ELEMENT_TASK); + task.setAttribute(ATTRIBUTE_NAME_TASKID, td.userID); + task.setAttribute("StartAt", td.startMethod); + task.setAttribute("StartThread", td.startThread); + + td.node = task; + + /* Check if start() is nested by checking if the TaskStack is empty */ + if (cd.taskStack.isEmpty()) { /*Empty==>not a nested start()*/ + root.appendChild(task); + } else { /*Not empty ==> this start() is nested*/ + + StartData sd = (StartData) cd.taskStack.peek(); /*Peek the parent CallID on the stack*/ + sd.node.appendChild(task); + } + } catch (DOMException e) { + System.out.println("PerformanceLogger::updateXMLFileatStart DOM Error:" + e.toString()); + } + + /*Read the current time save it on stack */ + td.startTime = System.currentTimeMillis(); + cd.taskStack.push(td); + return td.startTime; + } + + /** + * public static long stop(): stop timer for default component + * The Task values will be recorded in the default component XML file + * @return + * - started time milliseconds + */ + public static long stop() { + return stop(DEFAULT_COMPONENT); + } + + /** + * public long stop(String comp_id): Stopping the timer for component comp_id + * @return + * - stopped time in milliseconds. + */ + public static long stop(String comp_id) { + + long st = System.currentTimeMillis(); + ComponentData cd = (ComponentData) perfLogRegistry.get(comp_id); + if (cd == null) { + System.out.println("SystemPerformanceLogger::stop(): invalid registration key"); + return 0; + } + StartData td = null; + try { + td = (StartData) cd.taskStack.pop(); + td.stopTime = st; + td.stopThread = Thread.currentThread().toString(); + td.stopMethod = getMethodName(false); + updateXMLFileAtStop(cd, td); + + //System.out.println("SystemPerformanceLogger::stop(): timer \"" + td.userID + "\" stopped. Elapsed time = " + + // (td.stopTime-td.startTime) + " millis."); + } catch (EmptyStackException e) { + System.out.println("SystemPerformanceLogger:: Probably too many stop() function calls. - " + e); + } + return td.stopTime; + } + + /** + * private void generateXMLFile(ComponentData cd): create XML file + * @param + * cd is the component data for creating the XML + * @return + * - An XML file is created with "Product" and "System" tags. + */ + private static void generateXMLFile(ComponentData cd) { + try { + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(cd.XMLFile), "UTF8")); + // DOMImplementation impl = new DOMImplementationImpl(); + // cd.doc = impl.createDocument(null, "Benchmark", null); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = null; + try { + builder = factory.newDocumentBuilder(); + } catch (ParserConfigurationException e1) { + } + DOMImplementation impl = builder.getDOMImplementation(); + cd.doc = impl.createDocument(null, "Benchmark", null); + // get root element and set attributes + Element root = cd.doc.getDocumentElement(); + root.setAttribute("BenchmarkID", cd.XMLFileID); + root.setAttribute("TimeStamp", cd.timeStamp); + + Element system = cd.doc.createElement("System"); + Element product = cd.doc.createElement("Product"); + + product.setAttribute("Feature", cd.feature); + product.setAttribute("Version", cd.version); + root.appendChild(product); + + system.setAttribute("OSName", System.getProperty("os.name")); + system.setAttribute("OSVersion", System.getProperty("os.version")); + system.setAttribute("JavaVersion", System.getProperty("java.version")); + system.setAttribute("JavaVMVersion", System.getProperty("java.vm.version")); + system.setAttribute("JavaClassPath", System.getProperty("java.class.path")); + system.setAttribute("JavaLibraryPath", System.getProperty("java.library.path")); + root.appendChild(system); + + Element norm = cd.doc.createElement("_NORMALIZATION_VALUES"); + Long ems = new Long(samplingTime); + norm.setAttribute("ElapsedTime", ems.toString()); + root.appendChild(norm); + + /* Insert comments for Task tag */ + Comment cmt1 = cd.doc.createComment("Each Task element represents one start/stop timer operation"); + Comment cmt2 = cd.doc.createComment("Time recorded is in milliseconds"); + Comment cmt3 = cd.doc.createComment("NormalizedFactor is the performance indicator. A larger value than the previous run might indicate performance degradation."); + root.appendChild(cmt1); + root.appendChild(cmt2); + root.appendChild(cmt3); + + try { + Source source = new DOMSource(cd.doc); + Result result = new StreamResult(writer); + Transformer t = TransformerFactory.newInstance().newTransformer(); + t.setOutputProperty(OutputKeys.INDENT, "yes"); + t.transform(source, result); + } catch (TransformerConfigurationException e2) { + } catch (TransformerFactoryConfigurationError e2) { + } catch (TransformerException e2) { + } + + // OutputFormat fmt = new OutputFormat(cd.doc); + // fmt.setLineSeparator(LineSeparator.Windows); + // fmt.setIndenting(true); + // fmt.setPreserveSpace(false); + // //writer.flush(); + // XMLSerializer serializer = new XMLSerializer(writer, fmt); + // serializer.serialize(cd.doc); + // writer.close(); + + } catch (java.io.IOException e) { + System.out.println("PerformanceLogger::updateXML IO Error:" + e.toString()); + } catch (DOMException e) { + System.out.println("PerformanceLogger::updateXML DOM Error:" + e.toString()); + } + } + + /** + * private void updateXMLFileAtStop(ComponentData cd, StartData td): update XML file with performance measurement info + * @return + * - A "Task" tag is created in the XML file with the current start and stop timer information. + */ + private static void updateXMLFileAtStop(ComponentData cd, StartData td) { + + try { + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(cd.XMLFile), "UTF8")); + cd.doc.getDocumentElement(); + Element task = td.node; + + /* Construct Long class insatnce for string manipulation */ + Long ems = new Long(td.stopTime - td.startTime); + Long sms = new Long(td.startTime); + Long tms = new Long(td.stopTime); + /*Calculate the normalization factor*/ + String normalizedFactor = "invalid"; + if (samplingTime > 0) { + Long sam = new Long(samplingTime); + Double val = new Double(ems.doubleValue() / sam.doubleValue()); + normalizedFactor = val.toString(); + } + + /* Update the document */ + task.setAttribute("ElapsedTime", ems.toString()); + task.setAttribute("NormalizedFactor", normalizedFactor); + task.setAttribute("StartTime", sms.toString()); + task.setAttribute("StopTime", tms.toString()); + task.setAttribute("StartAt", td.startMethod); + task.setAttribute("StartThread", td.startThread); + task.setAttribute("StopAt", td.stopMethod); + task.setAttribute("StopThread", td.stopThread); + + try { + Source source = new DOMSource(cd.doc); + Result result = new StreamResult(writer); + Transformer t = TransformerFactory.newInstance().newTransformer(); + t.setOutputProperty(OutputKeys.INDENT, "yes"); + t.transform(source, result); + } catch (TransformerConfigurationException e2) { + } catch (TransformerFactoryConfigurationError e2) { + } catch (TransformerException e2) { + } + + /*Now save the DOM*/ + // OutputFormat fmt = new OutputFormat(cd.doc); + // fmt.setLineSeparator(LineSeparator.Windows); + // fmt.setIndenting(true); + // fmt.setPreserveSpace(false); + // //writer.flush(); + // XMLSerializer serializer = new XMLSerializer(writer, fmt); + // serializer.serialize(cd.doc); + // writer.close(); + } catch (java.io.IOException e) { + System.out.println("PerformanceLogger::updateXMLFileAtStop IO Error:" + e.toString()); + } catch (DOMException e) { + System.out.println("PerformanceLogger::updateXMLFileAtStop DOM Error:" + e.toString()); + } + + } + + /** + * public String geCurrentProductInfo(int req, String comp_id) : retrieve the product information. + * @param + * req : OPTION_GET_FEATURE/OPTION_GET_VERSION + * comp_id : the component id + * @return + * "OPTION_GET_FEATURE":product feature as specified in register() + * "OPTION_GET_VERSION": product version as specified in register() + * no match: null + */ + public static String getCurrentProductInfo(int req, String comp_id) { + ComponentData cd = (ComponentData) perfLogRegistry.get(comp_id); + if (cd == null) { + System.out.println("PerformanceLogger::getCurrentProductInfo invalid comp_id"); + return null; + } + + if (req == OPTION_GET_FEATURE) + return cd.feature; + else if (req == OPTION_GET_VERSION) return cd.version; + return null; + } + + /** + * public String getXMLFileName(String comp_id) : get the XML file pathname + * @return + * The XML file fullpath name. + */ + public static String getXMLFileName(String comp_id) { + ComponentData cd = (ComponentData) perfLogRegistry.get(comp_id); + return cd.XMLFile.getAbsolutePath(); + } + + /** + * public String getMethodName(boolean parsed) : get the method name + * @param + * parsed : true or false + * @return + * if true method name is returned as class.method. + */ + private static String getMethodName(boolean parsed) { + + String methodPath = null; + Throwable e = new Throwable(); + StringWriter strwriter = new StringWriter(100); + e.printStackTrace(new java.io.PrintWriter(strwriter)); + String stack = strwriter.toString(); + java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(stack, "\r\n"); + /* + * Here to parse the exception string to get the caller which is the current method location + * to be obtained. The Exception stack should show the PerformanceLogger start() in the satck first: + * -java.lang.Exception + * -at com.ibm.etools.systems.logging.performance.PerformanceLogger.start(PerformanceLogger.java:151) + * -at com.ibm.etools.systems.logging.performance.PerformanceLogger.start(PerformanceLogger.java:135) + * Depending if the caller is using default task ID or not, so the caller is the 3rd or the 4th in the stack. */ - public static String normalize() { - /* - * Execute some standard code and time it to generate our normalization interval. - * Return the value to attempt to make it is not optimized by the compiler. - */ - long startTime = System.currentTimeMillis(); - Double q = null; - int i = 0; - int n = 1000000; - for ( i = 0; i < n; i++) { - Double dd = new Double(n); - Double dr = new Double(n+i); - q = new Double(dd.doubleValue() / dr.doubleValue()); - } - double val = q.doubleValue() / i; - long stopTime = System.currentTimeMillis(); - samplingTime = stopTime-startTime; - String result = "SystemPerformanceLogger::Normalization Elapsed time = " + samplingTime + " " + val; - return result; - } - - /** - * public static long start(): start timer using default component - * The Task values will be recorded in the default component XML file - * @return - * - started time milliseconds - */ - public static long start() { - if (_initialized == false) { - register(DEFAULT_COMPONENT,"",""); - } - /*Use the class method name for CallerID*/ - /* - * Sample method name retruned by getMethodName(): - * " com.ibm.etools.iseries.core.resources.ISeriesEditableSrcPhysicalFileMember.doDownload(ISeriesEditableSrcPhysicalFileMember.java:558)" - * - */ - String methodPath = getMethodName(true); - return start(DEFAULT_COMPONENT, methodPath); + for (int i = 0; tokenizer.hasMoreTokens(); i++) { + methodPath = tokenizer.nextToken(); + if ((methodPath.indexOf("java.lang.Throwable") == -1) && (methodPath.indexOf("logging.performance.PerformanceLogger") == -1)) break; } - - /** - * public static long start(String comp_id): start timer for component comp_id using default TaskID - * @parm : - * comp_id : component registered previously by register(comp_id,..) - * @return - * - started time in milliseconds. - */ - public static long start(String comp_id) { - String methodPath = getMethodName(true); - return start(comp_id, methodPath); - - } - - /** - * public long start(String comp_id, String call_id): start the timer for registered component comp_id - * @parm - * comp_id is the registered component - * call_id is the "CallID" attribute value for the XML tag "Task" - * @return - * - started time in milliseconds. - */ - public static long start(String comp_id, String call_id) { - - if (perfLogRegistry.containsKey(comp_id) == false) { - System.out.println("PerformanceLogger:start(): component \"" + comp_id + "\" not registered"); - return -1; - } - - ComponentData cd = (ComponentData)perfLogRegistry.get(comp_id); - StartData td = new StartData(); - - td.userID = call_id; - td.startThread = Thread.currentThread().toString(); - td.startMethod = getMethodName(false); - - /* Create the new Task Element in the DOC */ + methodPath = methodPath.substring(4); + if (parsed) { try { - - //BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(cd.XMLFile), "UTF8")); - Element root = cd.doc.getDocumentElement(); - Element task = cd.doc.createElement(ELEMENT_TASK); - task.setAttribute(ATTRIBUTE_NAME_TASKID, td.userID); - task.setAttribute("StartAt", td.startMethod); - task.setAttribute("StartThread", td.startThread); - - td.node = task; - - /* Check if start() is nested by checking if the TaskStack is empty */ - if ( cd.taskStack.isEmpty() ) { /*Empty==>not a nested start()*/ - root.appendChild(task); - } - else { /*Not empty ==> this start() is nested*/ - - StartData sd = (StartData)cd.taskStack.peek(); /*Peek the parent CallID on the stack*/ - sd.node.appendChild(task); - } - } - catch (DOMException e) - { - System.out.println("PerformanceLogger::updateXMLFileatStart DOM Error:" + e.toString()); - } - - /*Read the current time save it on stack */ - td.startTime = System.currentTimeMillis(); - cd.taskStack.push(td); - return td.startTime; - } - - /** - * public static long stop(): stop timer for default component - * The Task values will be recorded in the default component XML file - * @return - * - started time milliseconds - */ - public static long stop() { - return stop(DEFAULT_COMPONENT); - } - - /** - * public long stop(String comp_id): Stopping the timer for component comp_id - * @return - * - stopped time in milliseconds. - */ - public static long stop(String comp_id) { - - long st = System.currentTimeMillis(); - ComponentData cd = (ComponentData)perfLogRegistry.get(comp_id); - if (cd == null) { - System.out.println("SystemPerformanceLogger::stop(): invalid registration key"); - return 0; - } - StartData td = null; - try { - td = (StartData)cd.taskStack.pop(); - td.stopTime = st; - td.stopThread = Thread.currentThread().toString(); - td.stopMethod = getMethodName(false); - updateXMLFileAtStop(cd,td); - - //System.out.println("SystemPerformanceLogger::stop(): timer \"" + td.userID + "\" stopped. Elapsed time = " + - // (td.stopTime-td.startTime) + " millis."); - } - catch (EmptyStackException e) { - System.out.println("SystemPerformanceLogger:: Probably too many stop() function calls. - " + e); - } - return td.stopTime; - } - - - /** - * private void generateXMLFile(ComponentData cd): create XML file - * @param - * cd is the component data for creating the XML - * @return - * - An XML file is created with "Product" and "System" tags. - */ - private static void generateXMLFile(ComponentData cd){ - try { - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(cd.XMLFile), "UTF8")); -// DOMImplementation impl = new DOMImplementationImpl(); -// cd.doc = impl.createDocument(null, "Benchmark", null); - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = null; - try { - builder = factory.newDocumentBuilder(); - } catch (ParserConfigurationException e1) { - } - DOMImplementation impl = builder.getDOMImplementation(); - cd.doc = impl.createDocument(null, "Benchmark", null); - // get root element and set attributes - Element root = cd.doc.getDocumentElement(); - root.setAttribute("BenchmarkID", cd.XMLFileID); - root.setAttribute("TimeStamp", cd.timeStamp); - - Element system = cd.doc.createElement("System"); - Element product = cd.doc.createElement("Product"); - - product.setAttribute("Feature", cd.feature); - product.setAttribute("Version", cd.version); - root.appendChild(product); - - system.setAttribute("OSName",System.getProperty("os.name")); - system.setAttribute("OSVersion",System.getProperty("os.version")); - system.setAttribute("JavaVersion",System.getProperty("java.version")); - system.setAttribute("JavaVMVersion",System.getProperty("java.vm.version")); - system.setAttribute("JavaClassPath",System.getProperty("java.class.path")); - system.setAttribute("JavaLibraryPath",System.getProperty("java.library.path")); - root.appendChild(system); - - Element norm = cd.doc.createElement("_NORMALIZATION_VALUES"); - Long ems = new Long(samplingTime); - norm.setAttribute("ElapsedTime",ems.toString()); - root.appendChild(norm); - - /* Insert comments for Task tag */ - Comment cmt1 = cd.doc.createComment("Each Task element represents one start/stop timer operation"); - Comment cmt2 = cd.doc.createComment("Time recorded is in milliseconds"); - Comment cmt3 = cd.doc.createComment("NormalizedFactor is the performance indicator. A larger value than the previous run might indicate performance degradation."); - root.appendChild(cmt1); - root.appendChild(cmt2); - root.appendChild(cmt3); - - try { - Source source = new DOMSource(cd.doc); - Result result = new StreamResult(writer); - Transformer t = TransformerFactory.newInstance().newTransformer(); - t.setOutputProperty(OutputKeys.INDENT, "yes"); - t.transform(source, result); - } catch (TransformerConfigurationException e2) { - } catch (TransformerFactoryConfigurationError e2) { - } catch (TransformerException e2) { - } - -// OutputFormat fmt = new OutputFormat(cd.doc); -// fmt.setLineSeparator(LineSeparator.Windows); -// fmt.setIndenting(true); -// fmt.setPreserveSpace(false); -// //writer.flush(); -// XMLSerializer serializer = new XMLSerializer(writer, fmt); -// serializer.serialize(cd.doc); -// writer.close(); - - } - catch (java.io.IOException e) - { - System.out.println("PerformanceLogger::updateXML IO Error:" + e.toString()); - } - catch (DOMException e) - { - System.out.println("PerformanceLogger::updateXML DOM Error:" + e.toString()); + /* The method name obtained looks like this: + * " com.ibm.etools.iseries.core.resources.ISeriesEditableSrcPhysicalFileMember.doDownload(ISeriesEditableSrcPhysicalFileMember.java:558)" + */ + int i = methodPath.indexOf('('); + if (i != -1) methodPath = methodPath.substring(0, i); //strip of the substring enclosed in () + //Now we have "com.ibm.etools.systems.logging.performance.PerformanceLogger.start" + i = methodPath.lastIndexOf('.'); //Get the method name after the last period (.) + String methodName = methodPath.substring(i + 1); //Now we have the method name "start" + String className = methodPath.substring(0, i); //remove method name from the string + //We are left with "com.ibm.etools.systems.logging.performance.PerformanceLogger" + i = className.lastIndexOf('.'); + if (i != -1) className = className.substring(i + 1); //Now we have the class name "PerformanceLogger" + methodPath = className + "." + methodName; + } catch (IndexOutOfBoundsException ex) { + System.out.println("PerformanceLogger:getMethodName exception" + ex.toString()); } } + return methodPath; /*delete " at" in the beginning of the string */ + } - /** - * private void updateXMLFileAtStop(ComponentData cd, StartData td): update XML file with performance measurement info - * @return - * - A "Task" tag is created in the XML file with the current start and stop timer information. - */ - private static void updateXMLFileAtStop(ComponentData cd, StartData td ){ - - try { - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(cd.XMLFile), "UTF8")); - cd.doc.getDocumentElement(); - Element task = td.node; + /** + * public static void listSystemProfile(): retrieve the system information. + * @return + * These values will be retrieved and printed in stdout: + * java.version + * java.vm.version + * java.class.version + * java.class.path + * java.library.path + * os.name + * os.version + */ + public static void listSystemProfile() { + System.out.println("java version : " + System.getProperty("java.version")); + System.out.println("OS name : " + System.getProperty("os.name")); + System.out.println("OS version : " + System.getProperty("os.version")); + System.out.println("working dir : " + System.getProperty("user.dir")); + System.out.println("home dir : " + System.getProperty("home.dir")); + } - /* Construct Long class insatnce for string manipulation */ - Long ems = new Long(td.stopTime-td.startTime); - Long sms = new Long(td.startTime); - Long tms = new Long(td.stopTime); - /*Calculate the normalization factor*/ - String normalizedFactor = "invalid"; - if (samplingTime > 0) { - Long sam = new Long(samplingTime); - Double val = new Double(ems.doubleValue()/sam.doubleValue()); - normalizedFactor = val.toString(); - } + /** + * public static void main() : This main is used for testing this PerformanceLogger functions. + * The objective is to check the XML output format for nested start() calls. + */ + public static void main(String[] args) { - /* Update the document */ - task.setAttribute("ElapsedTime",ems.toString()); - task.setAttribute("NormalizedFactor",normalizedFactor); - task.setAttribute("StartTime",sms.toString()); - task.setAttribute("StopTime",tms.toString()); - task.setAttribute("StartAt", td.startMethod); - task.setAttribute("StartThread", td.startThread); - task.setAttribute("StopAt", td.stopMethod); - task.setAttribute("StopThread", td.stopThread); + int i = 0; - try { - Source source = new DOMSource(cd.doc); - Result result = new StreamResult(writer); - Transformer t = TransformerFactory.newInstance().newTransformer(); - t.setOutputProperty(OutputKeys.INDENT, "yes"); - t.transform(source, result); - } catch (TransformerConfigurationException e2) { - } catch (TransformerFactoryConfigurationError e2) { - } catch (TransformerException e2) { - } - - /*Now save the DOM*/ -// OutputFormat fmt = new OutputFormat(cd.doc); -// fmt.setLineSeparator(LineSeparator.Windows); -// fmt.setIndenting(true); -// fmt.setPreserveSpace(false); -// //writer.flush(); -// XMLSerializer serializer = new XMLSerializer(writer, fmt); -// serializer.serialize(cd.doc); -// writer.close(); - } - catch (java.io.IOException e) - { - System.out.println("PerformanceLogger::updateXMLFileAtStop IO Error:" + e.toString()); - } - catch (DOMException e) - { - System.out.println("PerformanceLogger::updateXMLFileAtStop DOM Error:" + e.toString()); - } - - } - - /** - * public String geCurrentProductInfo(int req, String comp_id) : retrieve the product information. - * @param - * req : OPTION_GET_FEATURE/OPTION_GET_VERSION - * comp_id : the component id - * @return - * "OPTION_GET_FEATURE":product feature as specified in register() - * "OPTION_GET_VERSION": product version as specified in register() - * no match: null - */ - public static String getCurrentProductInfo(int req, String comp_id) { - ComponentData cd = (ComponentData)perfLogRegistry.get(comp_id); - if (cd == null) { - System.out.println("PerformanceLogger::getCurrentProductInfo invalid comp_id"); - return null; - } - - if (req == OPTION_GET_FEATURE) - return cd.feature; - else if (req == OPTION_GET_VERSION) - return cd.version; - return null; + if (isPerformanceLoggingEnabled()) { + PerformanceLogger.start(); //Start timer using default component } - - /** - * public String getXMLFileName(String comp_id) : get the XML file pathname - * @return - * The XML file fullpath name. - */ - public static String getXMLFileName(String comp_id) { - ComponentData cd = (ComponentData)perfLogRegistry.get(comp_id); - return cd.XMLFile.getAbsolutePath(); - } - - /** - * public String getMethodName(boolean parsed) : get the method name - * @param - * parsed : true or false - * @return - * if true method name is returned as class.method. - */ - private static String getMethodName(boolean parsed) { - - String methodPath = null; - Throwable e = new Throwable(); - StringWriter strwriter = new StringWriter(100); - e.printStackTrace(new java.io.PrintWriter(strwriter)); - String stack = strwriter.toString(); - java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(stack, "\r\n"); - /* - * Here to parse the exception string to get the caller which is the current method location - * to be obtained. The Exception stack should show the PerformanceLogger start() in the satck first: - * -java.lang.Exception - * -at com.ibm.etools.systems.logging.performance.PerformanceLogger.start(PerformanceLogger.java:151) - * -at com.ibm.etools.systems.logging.performance.PerformanceLogger.start(PerformanceLogger.java:135) - * Depending if the caller is using default task ID or not, so the caller is the 3rd or the 4th in the stack. - */ - - for (int i = 0; tokenizer.hasMoreTokens(); i++) - { - methodPath = tokenizer.nextToken(); - if ( (methodPath.indexOf("java.lang.Throwable") == -1) && - (methodPath.indexOf("logging.performance.PerformanceLogger") == -1) ) - break; - } - methodPath = methodPath.substring(4); - if (parsed) { - try - { - /* The method name obtained looks like this: - * " com.ibm.etools.iseries.core.resources.ISeriesEditableSrcPhysicalFileMember.doDownload(ISeriesEditableSrcPhysicalFileMember.java:558)" - */ - int i = methodPath.indexOf('('); - if ( i != -1) - methodPath = methodPath.substring(0,i); //strip of the substring enclosed in () - //Now we have "com.ibm.etools.systems.logging.performance.PerformanceLogger.start" - i = methodPath.lastIndexOf('.'); //Get the method name after the last period (.) - String methodName =methodPath.substring(i+1); //Now we have the method name "start" - String className = methodPath.substring(0,i); //remove method name from the string - //We are left with "com.ibm.etools.systems.logging.performance.PerformanceLogger" - i = className.lastIndexOf('.'); - if ( i != -1) - className = className.substring(i+1); //Now we have the class name "PerformanceLogger" - methodPath = className+"."+methodName; - } - catch ( IndexOutOfBoundsException ex ) - { - System.out.println("PerformanceLogger:getMethodName exception" + ex.toString()); - } - } - return methodPath; /*delete " at" in the beginning of the string */ + for (i = 0; i < 1000000; i++) + ; + if (isPerformanceLoggingEnabled()) { + PerformanceLogger.stop(); } - /** - * public static void listSystemProfile(): retrieve the system information. - * @return - * These values will be retrieved and printed in stdout: - * java.version - * java.vm.version - * java.class.version - * java.class.path - * java.library.path - * os.name - * os.version - */ - public static void listSystemProfile() { - System.out.println("java version : " + System.getProperty("java.version")); - System.out.println("OS name : " + System.getProperty("os.name")); - System.out.println("OS version : " + System.getProperty("os.version")); - System.out.println("working dir : " + System.getProperty("user.dir")); - System.out.println("home dir : " + System.getProperty("home.dir")); - } - - /** - * public static void main() : This main is used for testing this PerformanceLogger functions. - * The objective is to check the XML output format for nested start() calls. - */ - public static void main(String[] args) { - - int i = 0; - - if (isPerformanceLoggingEnabled()) { - PerformanceLogger.start(); //Start timer using default component - } - for ( i = 0; i < 1000000; i++); - if (isPerformanceLoggingEnabled()) { - PerformanceLogger.stop(); - } - - PerformanceLogger.enablePerformanceLogging(true); - String key = PerformanceLogger.register("","WDSC","5120"); - key = PerformanceLogger.register("RSE","WDSC","5120"); - PerformanceLogger.deRegister("XXX"); //not registered key previously - System.out.println("Product info : " + - PerformanceLogger.getCurrentProductInfo(PerformanceLogger.OPTION_GET_FEATURE, key) + - " " + - PerformanceLogger.getCurrentProductInfo(PerformanceLogger.OPTION_GET_VERSION, key)); - PerformanceLogger.start(key, "NOT_NESTED_1"); - for ( i = 0; i < 1000000; i++); - PerformanceLogger.stop(key); - - PerformanceLogger.start(key,"NESTED_ONE"); - for ( i = 0; i < 500; i++); - PerformanceLogger.start(key,"NESTED_ONE_CHILD"); - for ( i = 0; i < 300; i++); - PerformanceLogger.stop(key); - PerformanceLogger.stop(key); + PerformanceLogger.enablePerformanceLogging(true); + String key = PerformanceLogger.register("", "WDSC", "5120"); + key = PerformanceLogger.register("RSE", "WDSC", "5120"); + PerformanceLogger.deRegister("XXX"); //not registered key previously + System.out.println("Product info : " + PerformanceLogger.getCurrentProductInfo(PerformanceLogger.OPTION_GET_FEATURE, key) + " " + + PerformanceLogger.getCurrentProductInfo(PerformanceLogger.OPTION_GET_VERSION, key)); + PerformanceLogger.start(key, "NOT_NESTED_1"); + for (i = 0; i < 1000000; i++) + ; + PerformanceLogger.stop(key); - PerformanceLogger.start(key, "NOT_NESTED_2"); - for ( i = 0; i < 2000000; i++); - PerformanceLogger.stop(key); - - PerformanceLogger.start(key, "NESTED_THREE"); - for ( i = 0; i < 300; i++); - PerformanceLogger.start(key, "NESTED_TWO_CHILD1"); - PerformanceLogger.start(key, "NESTED_TWO_CHILD2"); - for ( i = 0; i < 4000; i++); - PerformanceLogger.start(key, "NESTED_TWO_CHILD3"); - for ( i = 0; i < 6000; i++); - PerformanceLogger.stop(key); - PerformanceLogger.stop(key); - PerformanceLogger.stop(key); - PerformanceLogger.stop(key); - - PerformanceLogger.start("ABC"); //Expect error: not registered - PerformanceLogger.start(key); //record timer in the previous registered component - for ( i = 0; i < 3000000; i++); - PerformanceLogger.stop(key); - key = PerformanceLogger.register(key); // Expect error: already registered - PerformanceLogger.deRegister(key); - key = PerformanceLogger.register(key); - } - -} \ No newline at end of file + PerformanceLogger.start(key, "NESTED_ONE"); + for (i = 0; i < 500; i++) + ; + PerformanceLogger.start(key, "NESTED_ONE_CHILD"); + for (i = 0; i < 300; i++) + ; + PerformanceLogger.stop(key); + PerformanceLogger.stop(key); + + PerformanceLogger.start(key, "NOT_NESTED_2"); + for (i = 0; i < 2000000; i++) + ; + PerformanceLogger.stop(key); + + PerformanceLogger.start(key, "NESTED_THREE"); + for (i = 0; i < 300; i++) + ; + PerformanceLogger.start(key, "NESTED_TWO_CHILD1"); + PerformanceLogger.start(key, "NESTED_TWO_CHILD2"); + for (i = 0; i < 4000; i++) + ; + PerformanceLogger.start(key, "NESTED_TWO_CHILD3"); + for (i = 0; i < 6000; i++) + ; + PerformanceLogger.stop(key); + PerformanceLogger.stop(key); + PerformanceLogger.stop(key); + PerformanceLogger.stop(key); + + PerformanceLogger.start("ABC"); //Expect error: not registered + PerformanceLogger.start(key); //record timer in the previous registered component + for (i = 0; i < 3000000; i++) + ; + PerformanceLogger.stop(key); + key = PerformanceLogger.register(key); // Expect error: already registered + PerformanceLogger.deRegister(key); + key = PerformanceLogger.register(key); + } + +} \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/internal/logging/LabelUtil.java b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/ui/LabelUtil.java similarity index 99% rename from rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/internal/logging/LabelUtil.java rename to rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/ui/LabelUtil.java index b990ebec946..4eb53e2f95b 100644 --- a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/internal/logging/LabelUtil.java +++ b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/ui/LabelUtil.java @@ -14,7 +14,7 @@ * {Name} (company) - description of contribution. ********************************************************************************/ -package org.eclipse.rse.internal.logging; +package org.eclipse.rse.logging.ui; import java.util.HashSet; import java.util.Set; diff --git a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/ui/LoggingPreferenceLabels.java b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/ui/LoggingPreferenceLabels.java new file mode 100644 index 00000000000..ff81a062a3d --- /dev/null +++ b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/ui/LoggingPreferenceLabels.java @@ -0,0 +1,30 @@ +/******************************************************************************** + * Copyright (c) 2006 IBM Corporation. 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: + * David Dykstal (IBM) - 148434 Better F1 help. + ********************************************************************************/ +package org.eclipse.rse.logging.ui; + +import org.eclipse.osgi.util.NLS; + +public class LoggingPreferenceLabels extends NLS { + + private static String BUNDLE_NAME = "org.eclipse.rse.logging.ui.LoggingPreferenceLabels";//$NON-NLS-1$ + + public static String LOGGING_PREFERENCE_PAGE_TOPLABEL1; + public static String LOGGING_PREFERENCE_PAGE_TOPLABEL2; + public static String LOGGING_PREFERENCE_PAGE_ERRORS_ONLY; + public static String LOGGING_PREFERENCE_PAGE_WARNINGS_ERRORS; + public static String LOGGING_PREFERENCE_PAGE_INFO_DEBUG; + public static String LOGGING_PREFERENCE_PAGE_FULL_DEBUG; + + static { + // load message values from bundle file + NLS.initializeMessages(BUNDLE_NAME, LoggingPreferenceLabels.class); + } + +} diff --git a/rse/plugins/org.eclipse.rse.logging/RemoteSystemsLogging.properties b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/ui/LoggingPreferenceLabels.properties similarity index 65% rename from rse/plugins/org.eclipse.rse.logging/RemoteSystemsLogging.properties rename to rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/ui/LoggingPreferenceLabels.properties index 02c1b15ebc5..8719d721088 100644 --- a/rse/plugins/org.eclipse.rse.logging/RemoteSystemsLogging.properties +++ b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/ui/LoggingPreferenceLabels.properties @@ -21,12 +21,9 @@ # Preference Page # ---------------- -LoggingPreferencePage.topLabel1 = Specify the logging options for {0} -LoggingPreferencePage.topLabel2 = Logging Level: -LoggingPreferencePage.errors_only = Errors only -LoggingPreferencePage.warnings_errors = Warnings and errors -LoggingPreferencePage.info_debug = Warnings, errors and information messages -LoggingPreferencePage.full_debug = Full debug -LoggingPreferencePage.logging_location = Logging Location: -LoggingPreferencePage.log_to_file = Log to file (default) -LoggingPreferencePage.log_to_stdout = Log to Standard Out \ No newline at end of file +LOGGING_PREFERENCE_PAGE_TOPLABEL1 = Specify the logging options for {0} +LOGGING_PREFERENCE_PAGE_TOPLABEL2 = Logging Level: +LOGGING_PREFERENCE_PAGE_ERRORS_ONLY = Errors only +LOGGING_PREFERENCE_PAGE_WARNINGS_ERRORS = Warnings and errors +LOGGING_PREFERENCE_PAGE_INFO_DEBUG = Warnings, errors and information messages +LOGGING_PREFERENCE_PAGE_FULL_DEBUG = Full debug diff --git a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/LoggingPreferencePage.java b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/ui/LoggingPreferencePage.java similarity index 59% rename from rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/LoggingPreferencePage.java rename to rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/ui/LoggingPreferencePage.java index 455bb9a6839..038795ede60 100644 --- a/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/LoggingPreferencePage.java +++ b/rse/plugins/org.eclipse.rse.logging/src/org/eclipse/rse/logging/ui/LoggingPreferencePage.java @@ -11,23 +11,20 @@ * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. * * Contributors: + * Michael Berger (IBM Canada) - 148434 Better F1 help. * {Name} (company) - description of contribution. ********************************************************************************/ -package org.eclipse.rse.logging; - +package org.eclipse.rse.logging.ui; import java.text.MessageFormat; import java.util.Set; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.core.runtime.IExecutableExtension; -import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Plugin; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.preference.PreferenceStore; -import org.eclipse.rse.internal.logging.LabelUtil; +import org.eclipse.rse.logging.IRemoteSystemsLogging; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; @@ -37,32 +34,21 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; -import org.eclipse.ui.help.WorkbenchHelp; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.Bundle; - /** * An abstract preference page for all remote system logging.
* Use a subclass of this page if you need a preference page to control * logging. */ -public abstract class LoggingPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IExecutableExtension { - +public abstract class LoggingPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private Button radioButton0; private Button radioButton1; private Button radioButton2; private Button radioButton3; - private Button radioButtonLogFile; - private Button radioButtonLogView; - - /** - * This is the plugin instance who's preference store will be used - * to control the settings on this page. Also, when this page is closed - * the settings are restored in the preference store of the above plugin. - */ - private Bundle bundle = null; /** * Creates composite control and sets the default layout data. @@ -90,37 +76,28 @@ public abstract class LoggingPreferencePage extends PreferencePage implements IW * Method declared on PreferencePage */ protected Control createContents(Composite parent) { + Bundle bundle = getBundle(); Composite composite_tab = createComposite(parent, 2); - String bundleName = (String)(bundle.getHeaders().get(org.osgi.framework.Constants.BUNDLE_NAME)); - String topLabel1 = RemoteSystemsLoggingPlugin.getResourceString("LoggingPreferencePage.topLabel1"); - topLabel1 = MessageFormat.format(topLabel1, new Object[] {bundleName}); + String bundleName = (String) (bundle.getHeaders().get(org.osgi.framework.Constants.BUNDLE_NAME)); + String topLabel1 = LoggingPreferenceLabels.LOGGING_PREFERENCE_PAGE_TOPLABEL1; + topLabel1 = MessageFormat.format(topLabel1, new Object[] { bundleName }); createLabel(composite_tab, topLabel1); forceSpace(composite_tab); - String topLabel2 = RemoteSystemsLoggingPlugin.getResourceString("LoggingPreferencePage.topLabel2"); + String topLabel2 = LoggingPreferenceLabels.LOGGING_PREFERENCE_PAGE_TOPLABEL2; createLabel(composite_tab, topLabel2); tabForward(composite_tab); Composite composite1_radioButton = createComposite(composite_tab, 1); - String text = RemoteSystemsLoggingPlugin.getResourceString("LoggingPreferencePage.errors_only"); + String text = LoggingPreferenceLabels.LOGGING_PREFERENCE_PAGE_ERRORS_ONLY; Set used = LabelUtil.usedFromString("ad"); // the mnemonics already used on preference page (in English) radioButton0 = createRadioButton(composite1_radioButton, LabelUtil.assignMnemonic(text, used)); - text = RemoteSystemsLoggingPlugin.getResourceString("LoggingPreferencePage.warnings_errors"); + text = LoggingPreferenceLabels.LOGGING_PREFERENCE_PAGE_WARNINGS_ERRORS; radioButton1 = createRadioButton(composite1_radioButton, LabelUtil.assignMnemonic(text, used)); - text = RemoteSystemsLoggingPlugin.getResourceString("LoggingPreferencePage.info_debug"); + text = LoggingPreferenceLabels.LOGGING_PREFERENCE_PAGE_INFO_DEBUG; radioButton2 = createRadioButton(composite1_radioButton, LabelUtil.assignMnemonic(text, used)); - // now add debug stuff, that only shows up in a debug build. - if (Logger.DEBUG) { - radioButton3 = createRadioButton(composite1_radioButton, RemoteSystemsLoggingPlugin.getResourceString("LoggingPreferencePage.full_debug")); - Composite composite_tab2 = createComposite(parent, 2); - Label label3 = createLabel(composite_tab2, RemoteSystemsLoggingPlugin.getResourceString("LoggingPreferencePage.logging_location")); - tabForward(composite_tab2); - Composite composite_radioButton2 = createComposite(composite_tab2, 1); - radioButtonLogFile = createRadioButton(composite_radioButton2, RemoteSystemsLoggingPlugin.getResourceString("LoggingPreferencePage.log_to_file")); - radioButtonLogView = createRadioButton(composite_radioButton2, RemoteSystemsLoggingPlugin.getResourceString("LoggingPreferencePage.log_to_stdout")); - WorkbenchHelp.setHelp(composite_tab2, "com.ibm.etools.systems.logging.pref0000"); - } + text = LoggingPreferenceLabels.LOGGING_PREFERENCE_PAGE_FULL_DEBUG; + radioButton3 = createRadioButton(composite1_radioButton, LabelUtil.assignMnemonic(text, used)); initializeValues(); - RemoteSystemsLoggingPlugin.out.logInfo("created LoggingPreferencePage"); - WorkbenchHelp.setHelp(composite_tab, "com.ibm.etools.systems.logging.pref0000"); + PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, "com.ibm.etools.systems.logging.rsel0000"); return new Composite(parent, SWT.NULL); } @@ -162,24 +139,27 @@ public abstract class LoggingPreferencePage extends PreferencePage implements IW * */ protected IPreferenceStore doGetPreferenceStore() { - + Bundle bundle = getBundle(); if (bundle != null) { AbstractUIPlugin plugin = getPlugin(); - if (plugin != null) { return plugin.getPreferenceStore(); - } - else { + } else { return new PreferenceStore(); } - } - else { + } else { return new PreferenceStore(); } } - + protected abstract AbstractUIPlugin getPlugin(); + private Bundle getBundle() { + Plugin plugin = getPlugin(); + Bundle bundle = plugin.getBundle(); + return bundle; + } + /** * Method declared on IWorkbenchPreferencePage */ @@ -195,36 +175,24 @@ public abstract class LoggingPreferencePage extends PreferencePage implements IW radioButton0.setSelection(false); radioButton1.setSelection(false); radioButton2.setSelection(false); - if (null != radioButton3) - radioButton3.setSelection(false); - if (Logger.DEBUG) { - radioButtonLogFile.setSelection(false); - radioButtonLogView.setSelection(false); - } + if (null != radioButton3) radioButton3.setSelection(false); int choice = store.getInt(IRemoteSystemsLogging.DEBUG_LEVEL); switch (choice) { - case 0 : - radioButton0.setSelection(true); - break; - case 1 : - radioButton1.setSelection(true); - break; - case 2 : - radioButton2.setSelection(true); - break; - case 3 : - if (null != radioButton3) - radioButton3.setSelection(true); - else - radioButton2.setSelection(true); - break; - } - if (Logger.DEBUG) { - String log_location = store.getString(IRemoteSystemsLogging.LOG_LOCATION); - if (log_location.equalsIgnoreCase(IRemoteSystemsLogging.LOG_TO_STDOUT)) - radioButtonLogView.setSelection(true); + case 0: + radioButton0.setSelection(true); + break; + case 1: + radioButton1.setSelection(true); + break; + case 2: + radioButton2.setSelection(true); + break; + case 3: + if (null != radioButton3) + radioButton3.setSelection(true); else - radioButtonLogFile.setSelection(true); + radioButton2.setSelection(true); + break; } } @@ -237,36 +205,24 @@ public abstract class LoggingPreferencePage extends PreferencePage implements IW radioButton0.setSelection(false); radioButton1.setSelection(false); radioButton2.setSelection(false); - if (null != radioButton3) - radioButton3.setSelection(false); - if (Logger.DEBUG) { - radioButtonLogFile.setSelection(false); - radioButtonLogView.setSelection(false); - } + if (null != radioButton3) radioButton3.setSelection(false); int choice = store.getDefaultInt(IRemoteSystemsLogging.DEBUG_LEVEL); switch (choice) { - case 0 : - radioButton0.setSelection(true); - break; - case 1 : - radioButton1.setSelection(true); - break; - case 2 : - radioButton2.setSelection(true); - break; - case 3 : - if (null != radioButton3) - radioButton3.setSelection(true); - else - radioButton2.setSelection(true); - break; - } - if (Logger.DEBUG) { - String log_location = store.getDefaultString(IRemoteSystemsLogging.LOG_LOCATION); - if (log_location.equalsIgnoreCase(IRemoteSystemsLogging.LOG_TO_STDOUT)) - radioButtonLogView.setSelection(true); + case 0: + radioButton0.setSelection(true); + break; + case 1: + radioButton1.setSelection(true); + break; + case 2: + radioButton2.setSelection(true); + break; + case 3: + if (null != radioButton3) + radioButton3.setSelection(true); else - radioButtonLogFile.setSelection(true); + radioButton2.setSelection(true); + break; } } @@ -296,17 +252,8 @@ public abstract class LoggingPreferencePage extends PreferencePage implements IW choice = 1; else if (radioButton2.getSelection()) choice = 2; - else if (null != radioButton3 && radioButton3.getSelection()) - choice = 3; + else if (null != radioButton3 && radioButton3.getSelection()) choice = 3; store.setValue(IRemoteSystemsLogging.DEBUG_LEVEL, choice); - if (Logger.DEBUG) { - String log_location = ""; - if (radioButtonLogFile.getSelection()) - log_location = IRemoteSystemsLogging.LOG_TO_FILE; - else - log_location = IRemoteSystemsLogging.LOG_TO_STDOUT; - store.setValue(IRemoteSystemsLogging.LOG_LOCATION, log_location); - } } /** @@ -336,17 +283,4 @@ public abstract class LoggingPreferencePage extends PreferencePage implements IW data.horizontalSpan = 2; label.setLayoutData(data); } - - /** - * This is needed to get to the plugin id, and then plugin instance. - */ - public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException { - try { - String pluginName = config.getDeclaringExtension().getContributor().getName(); - this.bundle = Platform.getBundle(pluginName); - } catch (Exception e) { - RemoteSystemsLoggingPlugin.out.logError("Failed to create LoggingPreferencePage.", e); - } - } - } \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/propertypages/SystemLoggingPreferencePage.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/propertypages/SystemLoggingPreferencePage.java index 92070fc14e6..4279b28a7ba 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/propertypages/SystemLoggingPreferencePage.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/propertypages/SystemLoggingPreferencePage.java @@ -16,7 +16,7 @@ package org.eclipse.rse.ui.propertypages; -import org.eclipse.rse.logging.LoggingPreferencePage; +import org.eclipse.rse.logging.ui.LoggingPreferencePage; import org.eclipse.rse.ui.RSEUIPlugin; import org.eclipse.ui.plugin.AbstractUIPlugin; diff --git a/rse/plugins/org.eclipse.rse.ui/filters/org/eclipse/rse/internal/filters/SystemFilterPoolManager.java b/rse/plugins/org.eclipse.rse.ui/filters/org/eclipse/rse/internal/filters/SystemFilterPoolManager.java index 2e15ed7311c..eead5be78bd 100644 --- a/rse/plugins/org.eclipse.rse.ui/filters/org/eclipse/rse/internal/filters/SystemFilterPoolManager.java +++ b/rse/plugins/org.eclipse.rse.ui/filters/org/eclipse/rse/internal/filters/SystemFilterPoolManager.java @@ -1810,7 +1810,7 @@ public class SystemFilterPoolManager implements ISystemFilterPoolManager */ public void logDebugMessage(String prefix, String message) { - if ((Logger.DEBUG) && (logger!=null)) + if ((logger!=null)) { logger.logDebugMessage(prefix, message); } diff --git a/rse/plugins/org.eclipse.rse.ui/subsystems/org/eclipse/rse/core/subsystems/AbstractConnectorService.java b/rse/plugins/org.eclipse.rse.ui/subsystems/org/eclipse/rse/core/subsystems/AbstractConnectorService.java index e226d73c158..1b1fc7d01c8 100644 --- a/rse/plugins/org.eclipse.rse.ui/subsystems/org/eclipse/rse/core/subsystems/AbstractConnectorService.java +++ b/rse/plugins/org.eclipse.rse.ui/subsystems/org/eclipse/rse/core/subsystems/AbstractConnectorService.java @@ -448,15 +448,13 @@ public abstract class AbstractConnectorService extends RSEModelObject implements if (passwordInformation == null && oldUserId != null && !forcePrompt) { SystemSignonInformation savedPasswordInformation = ppm.find(hostType, hostName, oldUserId); if (savedPasswordInformation != null) { - if (validator != null) { - if (!validator.isValid(shell, savedPasswordInformation)) { - passwordValid = false; - clearPasswordCache(); - passwordInformation = null; - } else { - setPasswordInformation(savedPasswordInformation); - passwordInformation = getPasswordInformation(); - } + if (validator == null || validator.isValid(shell, savedPasswordInformation)) { + setPasswordInformation(savedPasswordInformation); + passwordInformation = getPasswordInformation(); + } else { + passwordValid = false; + clearPasswordCache(); + passwordInformation = null; } } } @@ -1087,7 +1085,7 @@ public abstract class AbstractConnectorService extends RSEModelObject implements } private void logException(Throwable t) { - Logger log = LoggerFactory.getInst(RSEUIPlugin.getDefault()); + Logger log = LoggerFactory.getLogger(RSEUIPlugin.getDefault()); log.logError("Unexpected exception", t); } diff --git a/rse/plugins/org.eclipse.rse.ui/systems/org/eclipse/rse/core/SystemBasePlugin.java b/rse/plugins/org.eclipse.rse.ui/systems/org/eclipse/rse/core/SystemBasePlugin.java index 1555533d42f..db01364bfb6 100644 --- a/rse/plugins/org.eclipse.rse.ui/systems/org/eclipse/rse/core/SystemBasePlugin.java +++ b/rse/plugins/org.eclipse.rse.ui/systems/org/eclipse/rse/core/SystemBasePlugin.java @@ -655,10 +655,7 @@ public abstract class SystemBasePlugin extends AbstractUIPlugin */ public static void logDebugMessage(String prefix, String message) { - if (Logger.DEBUG) - { - log.logDebugMessage(prefix, message); - } + log.logDebugMessage(prefix, message); } /** @@ -716,7 +713,7 @@ public abstract class SystemBasePlugin extends AbstractUIPlugin // logger if (log == null) { - log = LoggerFactory.getInst(this); + log = LoggerFactory.getLogger(this); log.logInfo("Loading " + this.getClass()); } } @@ -726,7 +723,7 @@ public abstract class SystemBasePlugin extends AbstractUIPlugin */ public void stop(BundleContext context) throws Exception { logDebugMessage(this.getClass().getName(), "SHUTDOWN"); - LoggerFactory.freeInst(this); + LoggerFactory.freeLogger(this); super.stop(context); }