sysperfana/memspyext/com.nokia.s60tools.memspy/src/com/nokia/s60tools/memspy/plugin/MemSpyPlugin.java
changeset 7 8e12a575a9b5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/memspyext/com.nokia.s60tools.memspy/src/com/nokia/s60tools/memspy/plugin/MemSpyPlugin.java	Wed Apr 21 20:01:08 2010 +0300
@@ -0,0 +1,363 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+
+package com.nokia.s60tools.memspy.plugin;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+import com.nokia.s60tools.memspy.export.ITraceClientNotificationsIf;
+import com.nokia.s60tools.memspy.export.ITraceDataProcessor;
+import com.nokia.s60tools.memspy.export.ITraceProvider;
+import com.nokia.s60tools.memspy.resources.ImageResourceManager;
+import com.nokia.s60tools.memspy.util.MemSpyConsole;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+
+/**
+ * The activator class controls the plug-in life cycle.
+ */
+public class MemSpyPlugin extends AbstractUIPlugin {
+
+	/**
+	 * Plug-in ID for Launcher plug-in.
+	 */
+	public static final String MEMSPY_TRACE_PLUGIN_ID = "com.nokia.s60tools.memspy.trace";//$NON-NLS-1$
+	/**
+	 * Launcher plug-in binaries directory name.
+	 */
+	public static final String LAUNCHER_BINARIES_DIR_NAME = "Launcher.binaries";//$NON-NLS-1$
+	
+	/**
+	 * Trace provider extension name.
+	 */
+	final String EXTENSION_TRACE_PROVIDER = "traceprovider"; //$NON-NLS-1$
+	
+	/**
+	 * Plug-in ID constant.
+	 */
+	public static final String PLUGIN_ID = "com.nokia.s60tools.memspy";
+	
+	/**
+	 * Member for storing plug-in install path.
+	 */
+	private String pluginInstallPath = "";
+	
+	/**
+	 * Shared plug-in instance
+	 */
+	private static MemSpyPlugin plugin;
+	
+	/**
+	 * Storing reference to possibly installed trace provider plug-in. 
+	 */
+	private static ITraceProvider traceProvider;
+	
+	/**
+	 * Preferences store instance reference.
+	 */
+	private static IPreferenceStore prefsStore;
+	
+	/**
+	 * SWMT category setting feature is enabled by default, but may be disabled in case device does not support it.
+	 */
+	boolean isSWMTCategorySettingFeatureEnabled = true;	
+
+	/**
+	 * The constructor
+	 */
+	public MemSpyPlugin() {
+		plugin = this;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+		
+		String pluginInstallLocation = getPluginInstallPath();
+		String imagesPath = getImagesPath(pluginInstallLocation);
+		
+		// Loading images required by this plug-in
+		ImageResourceManager.loadImages(imagesPath);
+		
+		// Getting installed trace provider plug-in if available
+		traceProvider = findTraceProviderExtension();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static MemSpyPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Get plugin installation path
+	 * @return the path where this plugin is installed
+	 */
+	public static String getPluginInstallPath() {
+		try {
+			if ( plugin.pluginInstallPath.equals("") ) { //$NON-NLS-1$
+				 // URL to the plugin's root ("/")
+				URL relativeURL = plugin.getBundle().getEntry("/"); //$NON-NLS-1$
+				//	Converting into local path
+				URL localURL = FileLocator.toFileURL(relativeURL);
+				//	Getting install location in correct form
+				File f = new File(localURL.getPath());
+				plugin.pluginInstallPath = f.getAbsolutePath();
+			}
+			return plugin.pluginInstallPath;
+		} catch (Exception e) {
+			return ""; //$NON-NLS-1$
+		}
+	}
+	
+	/**
+	 * Gets images path relative to given plugin install path.
+	 * @param pluginInstallPath Plugin installation path.
+	 * @return Path were image resources are located.
+	 * @throws IOException
+	 */
+	private String getImagesPath(String pluginInstallPath) throws IOException{
+		return pluginInstallPath
+				+ File.separatorChar + "icons"; //$NON-NLS-1$
+	}
+
+	/**
+	 * This must be called from UI thread. If called
+	 * from non-ui thread this returns <code>null</code>.
+	 * @return Currently active workbench page.
+	 */
+	public static IWorkbenchPage getCurrentlyActivePage(){
+		return getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
+	}
+	
+	/**
+	 * This must be called from UI thread. If called
+	 * from non-UI thread this returns <code>null</code>.
+	 * @return The shell of the currently active workbench window..
+	 */
+	public static Shell getCurrentlyActiveWbWindowShell(){
+		IWorkbenchPage page = getCurrentlyActivePage();
+		if(page != null){
+			return page.getWorkbenchWindow().getShell();
+		}
+		return null;
+	}
+	
+	/**
+	 * Checks if SWMT category setting feature is enabled.
+	 * @return <code>true</code> if enabled, otherwise <code>false</code>.
+	 */
+	public boolean isSWMTCategorySettingFeatureEnabled() {
+		return isSWMTCategorySettingFeatureEnabled;
+	}
+
+	/**
+	 * Sets if SWMT category setting feature is enabled.
+	 * @param isSWMTCategorySettingFeatureEnabled <code>true</code> if enabled, otherwise <code>false</code>.
+	 */
+	public void setSWMTCategorySettingFeatureEnabled(
+			boolean isSWMTCategorySettingFeatureEnabled) {
+		this.isSWMTCategorySettingFeatureEnabled = isSWMTCategorySettingFeatureEnabled;
+	}
+	
+	/**
+	 * Gets MemSpy Launcher plugin's binaries directory path
+	 * @return path were Launcher binaries are located.
+	 */
+	public String getMemspyLauncherBinDir(){
+				
+		Bundle bundle = Platform
+			.getBundle(MEMSPY_TRACE_PLUGIN_ID); //$NON-NLS-1$
+		
+		String launcherBinDir = null;
+		try {
+			 // URL to the Launcher binaries
+			URL relativeURL = bundle.getEntry(LAUNCHER_BINARIES_DIR_NAME); //$NON-NLS-1$
+			//	Converting into local path
+			URL localURL = FileLocator.toFileURL(relativeURL);
+			//	Getting install location in correct form
+			File file = new File(localURL.getPath());
+			launcherBinDir = file.getAbsolutePath();
+			MemSpyConsole.getInstance().println("MemSpyLauncher binaries dir detected: " +launcherBinDir);
+			
+		} catch (IOException e) {
+			MemSpyConsole.getInstance().println("MemSpyLauncher binaries dir detection failed, reason: " +e);
+			e.printStackTrace();
+		}
+		return launcherBinDir;
+		
+	}	
+
+	/**
+	 * Returns PreferenceStore where plugin preferences are stored.
+	 * @return PreferenceStore where plugin preferences are stored
+	 */
+	public static IPreferenceStore getPrefsStore() {
+		if (prefsStore == null){
+			prefsStore = getDefault().getPreferenceStore();
+		}
+		
+		return prefsStore;
+	}
+
+	/**
+	 * Gets trace provider interface instance if available.
+	 * @return trace provider interface instance or <code>null</code> if not available
+	 */
+	public static ITraceProvider getTraceProvider(){
+		if(isTraceProviderAvailable()){
+			return traceProvider;			
+		}
+		// Otherwise returning a dummy provider instance
+		return createDummyTraceProviderInstance();
+	}
+	
+	/**
+	 * Creates a dummy trace provider instance.
+	 * Client can safely reference to this dummy instance without any <code>NullPointerException</code>
+	 * problems etc. However the corresponding functionalities from UI should be disables.
+	 * @return dummy trace provider instance.
+	 */
+	private static ITraceProvider createDummyTraceProviderInstance() {
+		// Creating  just a dummy provider instance that does not do anything
+		return new ITraceProvider() {
+			
+			public void stopListenTraceData() {
+				// dummy provider does not take any actions
+			}
+			
+			public boolean startListenTraceData(ITraceDataProcessor dataProcessor) {
+				// dummy provider does not take any actions
+				return false;
+			}
+			
+			public boolean sendStringData(String stringData) {
+				// dummy provider does not take any actions
+				return false;
+			}
+			
+			public boolean sendIntData(int integerData) {
+				// dummy provider does not take any actions
+				return false;
+			}
+			
+			public String getTraceSourcePreferencePageId() {
+				// dummy provider does not take any actions
+				return null;
+			}
+			
+			public String getDisplayNameForCurrentConnection() {
+				return "<no trace plug-in installed>";
+			}
+			
+			public void disconnectTraceSource() {
+				// dummy provider does not take any actions
+			}
+			
+			public boolean connectTraceSource(
+					ITraceClientNotificationsIf traceClient) {
+				// dummy provider does not take any actions
+				return false;
+			}
+			
+			public boolean activateTrace(String traceGroupID) {
+				// dummy provider does not take any actions
+				return false;
+			}
+
+		};
+	}
+
+	/**
+	 * Checks if trace provider plug-in is available.
+	 * @return <code>true</code> if trace provider interface available, otherwise <code>false</code>
+	 */
+	public static boolean isTraceProviderAvailable(){
+		return (traceProvider != null);
+	}
+	
+	/**
+	 * Tries to find trace provider plug-ins. Selecting the first found one.
+	 * @return reference to trace provider instance if found, otherwise <code>null</code>
+	 */
+	ITraceProvider findTraceProviderExtension() {
+		try {
+			IExtensionRegistry er = Platform.getExtensionRegistry();
+			IExtensionPoint ep = er.getExtensionPoint(PLUGIN_ID, EXTENSION_TRACE_PROVIDER);
+			String uniqueIdentifier = ep.getUniqueIdentifier();
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Found extension point: " + uniqueIdentifier); //$NON-NLS-1$
+			IExtension[] extensions = ep.getExtensions();
+			
+			// if plug-ins were found.
+			if (extensions != null && extensions.length > 0) {
+				
+				// read all found trace providers
+				for (int i = 0; i < extensions.length; i++) {
+					IConfigurationElement[] ce = extensions[i].getConfigurationElements();
+					if (ce != null && ce.length > 0) {
+						try {
+							ITraceProvider provider = (ITraceProvider)ce[0].createExecutableExtension("class"); //$NON-NLS-1$ 
+							// We support only one trace provider
+							if (provider != null) {
+								return provider;
+							}
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+		return null;
+	}	
+	
+}