diff -r 000000000000 -r a02c979e8dfd srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/plugin/AppDepPlugin.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/plugin/AppDepPlugin.java Sat Jan 09 10:04:11 2010 +0530 @@ -0,0 +1,408 @@ +/* +* Copyright (c) 2006 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.appdep.plugin; + +import java.io.File; +import java.io.IOException; +import java.net.URL; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +import com.nokia.s60tools.appdep.common.ProductInfoRegistry; +import com.nokia.s60tools.appdep.core.AppDepCacheIndexManager; +import com.nokia.s60tools.appdep.core.AppDepSettings; +import com.nokia.s60tools.appdep.core.job.AppDepJobManager; +import com.nokia.s60tools.appdep.resources.ImageKeys; +import com.nokia.s60tools.appdep.resources.ImageResourceManager; +import com.nokia.s60tools.appdep.resources.Messages; +import com.nokia.s60tools.appdep.util.AppDepConsole; +import com.nokia.s60tools.sdk.RVCTToolChainInfo; +import com.nokia.s60tools.sdk.SdkEnvInfomationResolveFailureException; +import com.nokia.s60tools.sdk.SdkManager; +import com.nokia.s60tools.util.console.IConsolePrintUtility; + +/** + * The main plugin class to be used in the desktop. + */ +public class AppDepPlugin extends AbstractUIPlugin { + + /** + * The shared instance. + */ + private static AppDepPlugin plugin; + + /** + * Command line tool settings should not be garbage collected + * during the plugin's lifetime. Having a reference in here + * should enforce that singleton class is not garbage collected. + */ + private static AppDepSettings settings; + + /** + * Also AppDepJobManager instance should not be garbage collected + * during the plugin's lifetime. Having a reference in here + * should enforce that singleton class is not garbage collected. + */ + private static AppDepJobManager pluginJobManager; + + /** + * Also AppDepCacheIndexManager instance should not be garbage collected + * during the plugin's lifetime. Having a reference in here + * should enforce that singleton class is not garbage collected. + */ + private static AppDepCacheIndexManager cacheIndexManager; + + /** + * Stores preferences + */ + private static IPreferenceStore prefsStore; + + + /** + * The constructor. + */ + public AppDepPlugin() { + plugin = this; + settings = AppDepSettings.getActiveSettings(); + pluginJobManager = AppDepJobManager.getInstance(); + cacheIndexManager = AppDepCacheIndexManager.getInstance(); + } + + /** + * Gets plug-in install path. + * @return plug-in install path + * @throws IOException + */ + private String getPluginInstallPath() throws IOException{ + // URL to the plugin's root ("/") + URL relativeURL = 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()); + String pluginInstallLocation = f.getAbsolutePath(); + + return pluginInstallLocation; + } + + /** + * 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 + + ProductInfoRegistry.getImagesDirectoryName(); + } + + /** + * This method is called upon plug-in activation + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + + //Startup sequence starting message + //This debug println has been left into the code in purpose + System.out.println("*** AppDep Plugin STARTUP..."); //$NON-NLS-1$ + + //Plug-in install location + String pluginInstallLocation = getPluginInstallPath(); + //This debug println has been left into the code in purpose + System.out.println("pluginInstallLocation: " + pluginInstallLocation); //$NON-NLS-1$ + + //Images path + String imagesPath = getImagesPath(pluginInstallLocation); + //This debug println has been left into the code in purpose + System.out.println("imagesPath: " + imagesPath); //$NON-NLS-1$ + + // Loading images required by this plug-in + ImageResourceManager.loadImages(imagesPath); + + initializeSettings(pluginInstallLocation); + + // Removing inconsistent partially created + // cache files, if such exist + settings.cleanupPartiallyCreatedCacheFiles(); + + //Startup sequence completed message + //This debug println has been left into the code in purpose + System.out.println("*** AppDep Plugin STARTED."); //$NON-NLS-1$ + } + + /** + * Initializing tool settings. + * @param pluginInstallPath Plugin installation path. + */ + private void initializeSettings(String pluginInstallPath) { + + // + // Settings gained from SDK Support Plug-in + // + + // RVCT tools + resolveDefaultRvctToolBinaries(); + //This debug println has been left into the code in purpose + System.out.println("RVCT Tool Binaries Directory: " + settings.getRvctToolsDir()); //$NON-NLS-1$ + System.out.println("RVCT Tool Version: " + settings.getRvctToolsVersion()); //$NON-NLS-1$ + + // GCCE tools + try { + settings.setGcceToolsDir(SdkManager.getCSLArmToolchainInstallPathAndCheckReqTools()); + settings.setGcceToolsInstalled( true ); + //This debug println has been left into the code in purpose + System.out.println("GCCE Tool Binaries Directory: " + settings.getGcceToolsDir()); //$NON-NLS-1$ + } catch (SdkEnvInfomationResolveFailureException e1) { + e1.printStackTrace(); + settings.setGcceToolsInstalled( false ); + AppDepConsole.getInstance().println(Messages.getString("AppDepPlugin.StartupFail_Msg_GCCE_Install_Location_Not_Found") //$NON-NLS-1$ + + e1.getMessage(), + IConsolePrintUtility.MSG_ERROR); + } + + // Checking that at least GCCE or RVCT tools are installed. + // If not installed, showing an error message to user and aborting + // plugin start by throwing an exception + boolean isRequiredToolsInstalled = (settings.isGcceToolsInstalled() + || settings.isRvctToolsInstalled()); + + if(! isRequiredToolsInstalled ){ + String errorMsg = Messages.getString("AppDepPlugin.StartupFail_Msg_Could_Not_Detect_Required_Toolchains") //$NON-NLS-1$ + + Messages.getString("AppDepPlugin.StartupFail_Msg_Required_Tools_Tip") //$NON-NLS-1$ + + Messages.getString("AppDepPlugin.StartupFail_Msg_Install_Required_Tools_Tip_Cont") //$NON-NLS-1$ + + "\n\n" //$NON-NLS-1$ + + Messages.getString("AppDepPlugin.StartupFail_Msg_Timeout_Network_Check"); //$NON-NLS-1$ + Shell sh = this.getWorkbench().getDisplay().getActiveShell(); + + String[] dlgButtonArr = { Messages.getString("AppDepPlugin.OK_Button_Label") }; //$NON-NLS-1$ + MessageDialog dlg = new MessageDialog(sh, + ProductInfoRegistry.getProductName(), + ImageResourceManager.getImage(ImageKeys.IMG_APP_ICON), + errorMsg, + MessageDialog.ERROR, + dlgButtonArr, + 0 + ); + dlg.create(); + dlg.open(); + throw new RuntimeException(errorMsg); + } + + // + // Setting location for external binaries + // + String externalProgramsPath = pluginInstallPath + + File.separatorChar + + ProductInfoRegistry.getWin32BinariesRelativePath(); + //External programs are to be found from this path + //This debug println has been left into the code in purpose + System.out.println("externalProgramsPath: " + externalProgramsPath); //$NON-NLS-1$ + settings.setExternalProgramsPathName(externalProgramsPath); + + // Resources path + String resourcesPath = pluginInstallPath + + File.separatorChar + + ProductInfoRegistry.getAppDepResourcesDirectory(); + //This debug println has been left into the code in purpose + System.out.println("resourcesPath: " + resourcesPath); //$NON-NLS-1$ + settings.setResourcesPath(resourcesPath); + + // Resolving XSL filename + String xslFileName = + ProductInfoRegistry.getAppDepExportXSLFileName(); + settings.setXSLFileName(xslFileName); + String isUsedByXSLFileName = + ProductInfoRegistry.getAppDepIsUsedByXSLFileName(); + settings.setIsUsedByXSLFileName(isUsedByXSLFileName); + } + + /** + * Resolves which RVCT Tool Binaries should be used by default. + * The selection of the used RVCT toolchain is made based on + * the following criteria: + * - If there is several possibilities. + * Using the binaries with newest timestamp. + * - If only one possibility was available, using it. If none reporting + * it to Console output. + */ + private void resolveDefaultRvctToolBinaries() { + + //Get all toolchains + RVCTToolChainInfo[] rvctTools = SdkManager.getInstalledRVCTTools(); + + if(rvctTools.length > 1){ + + // Environment variable is not defined or + // there was no match => Using the newest binaries. + useTheNewestAvailableRvctToolbinaries(rvctTools); + } + else if(rvctTools.length == 1){ + // There is only one possibility + useTheFirstAvailableToolchain(rvctTools); + } + else{ + settings.setRvctToolsInstalled( false ); + + AppDepConsole.getInstance().println(Messages.getString("AppDepPlugin.StartupFail_Msg_RVCT_Install_Location_Not_Found"), //$NON-NLS-1$ + IConsolePrintUtility.MSG_ERROR); + } + } + + /** + * Sets first encountered toolchain as used toolchain. + * @param rvctTools RVCT toolchain info object array. + */ + private void useTheFirstAvailableToolchain(RVCTToolChainInfo[] rvctTools) { + String rvctToolBinariesDirectory = rvctTools[0].getRvctToolBinariesDirectory(); + settings.setRvctToolsDir(rvctToolBinariesDirectory); + settings.setRvctToolsVersion(rvctTools[0].getRvctToolsVersion()); + settings.setRvctToolsInstalled( true ); + } + + /** + * Called when there is more than one available toolchain binaries. + * Resolves which one is the newest, and sets it as default. + * @param rvctTools Array to RVCT tool info structure. + */ + private void useTheNewestAvailableRvctToolbinaries(RVCTToolChainInfo[] rvctTools) { + String binDirStored = null; + String versionInfoStored = null; + long lastModifiedStored = 0; + for (int i = 0; i < rvctTools.length; i++) { + String binDirTmp = rvctTools[i].getRvctToolBinariesDirectory(); + String elfProg = binDirTmp + + File.separatorChar + + AppDepSettings.RVCT_FROM_ELF_EXECUTABLE; + File elfFile = new File(elfProg); + if(elfFile.exists()){ + long modified = elfFile.lastModified(); + if(modified > lastModifiedStored){ + lastModifiedStored = modified; + binDirStored = binDirTmp; + versionInfoStored = rvctTools[i].getRvctToolsVersion(); + } + } + } + if(binDirStored != null){ + settings.setRvctToolsDir(binDirStored); + settings.setRvctToolsVersion(versionInfoStored); + settings.setRvctToolsInstalled( true ); + } + else{ + useTheFirstAvailableToolchain(rvctTools); + } + } + + /** + * This method is called when the plug-in is stopped + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + + //Starting plugin shutdown sequence + //This debug println has been left into the code in purpose + System.out.println("AppDep Plugin SHUTDOWN..."); //$NON-NLS-1$ + + // Shutting down registered ongoing background jobs + pluginJobManager.shutdown(); + + // Informing also cache index manager about the shutdown + cacheIndexManager.shutdown(); + + // Removing inconsistent partially created + // cache files, if such exist + settings.cleanupPartiallyCreatedCacheFiles(); + + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance. + */ + public static AppDepPlugin getDefault() { + return plugin; + } + + /** + * Returns an image descriptor for the image file at the given + * plug-in relative path. + * @param path the path + * @return the image descriptor + */ + public static ImageDescriptor getImageDescriptor(String path) { + return AbstractUIPlugin.imageDescriptorFromPlugin("com.nokia.s60tools.appdep.plugin", path); //$NON-NLS-1$ + } + + /** + * This must be called from UI thread. If called + * from non-UI thread this returns null. + * @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 null. + * @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; + } + + /** + * Returns the PreferenceStore where plugin preferences are stored + * @return the PreferenceStore where plugin preferences are stored + */ + public static IPreferenceStore getPrefsStore(){ + if (prefsStore == null){ + prefsStore = getDefault().getPreferenceStore(); + } + + return prefsStore; + } + + /** + * Bounds given context sensitive help ID into given UI control. + * @param composite UI control to which bind given context-sensitive help ID. + * @param contextHelpID Context-sensitive help ID. + */ + public static void setContextSensitiveHelpID( + Control composite, String contextHelpID) { + PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, contextHelpID); + } + +}