net.rim.ejde.internal.signing.ImportCSIFilesAction.java Source code

Java tutorial

Introduction

Here is the source code for net.rim.ejde.internal.signing.ImportCSIFilesAction.java

Source

/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.signing;

/*********************************************************************
 * ImportCSIFiles.java
 *
 * Copyright (c) 2009 Research In Motion Inc.  All rights reserved.
 * This file contains confidential and proprietary information
 *
 * Creation date: September, 2009, 2:22:46 AM
 *
 * File:          $File$
 * Revision:      $Revision:$
 * Checked in by:  rgunaratnam
 * Last modified: $DateTime:$
 *
 *********************************************************************/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;

import javax.swing.UIManager;

import net.rim.ejde.internal.core.ContextManager;
import net.rim.ejde.internal.core.IConstants;
import net.rim.ejde.internal.util.Messages;
import net.rim.ejde.internal.util.VMToolsUtils;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;

/**
 * The actions opens a file dialog that allows user to select .csi files, it then call the signature tool to start registration
 * and generate key files.
 */
public class ImportCSIFilesAction implements IWorkbenchWindowActionDelegate {

    private static Logger log = Logger.getLogger(ImportCSIFilesAction.class);

    /**
     * Pointer to process if the signature tool is running
     */
    private Process process;

    /**
     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
     */
    public void dispose() {
        // Try to shutdown the signature tool if it is still running.
        if (process != null) {
            process.destroy();
        }
    }

    /**
     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
     */
    public void init(IWorkbenchWindow window) {
        // do nothing
    }

    /**
     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
     */
    public void run(IAction action) {
        if (process != null) {
            // If the process is running already...
            warnSignatureToolRunning();
        } else {
            // Open file dialog to allow user select a .csi file
            FileDialog dialog = new FileDialog(ContextManager.getActiveWorkbenchShell());
            String fileDialogLabel = "Select Signature File"; //$NON-NLS-1$
            String[] filters = new String[] { "*.csi" };
            String[] filterNames = new String[] { "Signature Files (*.csi)" };
            dialog.setFilterExtensions(filters);
            dialog.setFilterNames(filterNames);
            dialog.setText(fileDialogLabel);
            final String signatureFileToImport = dialog.open();
            if (StringUtils.isNotBlank(signatureFileToImport)) {
                // launch signature tool
                Thread newThread = new Thread() {
                    public void run() {
                        launchSignatureTool(signatureFileToImport);
                    }
                };
                newThread.start();
            }
        }
    }

    /**
     * Launches the Signature tool. It passes the .csi file to the signature tool.
     */
    private void launchSignatureTool(String csiFile) {
        log.debug("Entering SignatureToolAction launchSignatureTool()");

        // This is a list of the commands to run. The first position is the
        // actual command; subsequent entries are arguments.
        List<String> commands = new LinkedList<String>();

        // Find the path to java.exe
        String javaHome = System.getProperty("java.home");
        IPath javaBinPath = new Path(javaHome).append(IConstants.BIN_FOLD_NAME).append(IConstants.JAVA_CMD);
        commands.add(javaBinPath.toOSString());

        // Use the system look and feel
        String lookAndFeelClass = UIManager.getSystemLookAndFeelClassName();
        commands.add("-Dswing.defaultlaf=" + lookAndFeelClass);

        // Load from a jar
        commands.add("-jar");

        IPath sigPath;
        String sigPathString = IConstants.EMPTY_STRING;
        try {
            sigPath = VMToolsUtils.getSignatureToolPath();
            // check signature tool again
            if (!VMToolsUtils.isVMToolValid()) {
                Display.getDefault().syncExec(new Runnable() {
                    public void run() {
                        Shell shell = ContextManager.getActiveWorkbenchShell();
                        MessageDialog.openError(shell, Messages.ErrorHandler_DIALOG_TITLE,
                                Messages.SignatureTool_Not_Found_Msg);
                    }
                });
                log.error(Messages.SignatureTool_Not_Found_Msg);
                return;
            }
            sigPathString = sigPath.toOSString();
            commands.add(sigPathString);
            commands.add(csiFile);

        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }

        // Run the command
        ProcessBuilder processBuilder = new ProcessBuilder(commands);
        try {
            process = processBuilder.start();
            BufferedReader is = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String buffer;
            while ((buffer = is.readLine()) != null) {
                // Print out console output for debugging purposes...
                System.out.println(buffer);
            }
            process = null;
        } catch (IOException e) {
            e.printStackTrace();
        }

        log.debug("Leaving SignatureToolAction launchSignatureTool()");
    }

    /**
     * Displays a warning dialog indicating that the signature tool is already running.
     */
    private void warnSignatureToolRunning() {
        MessageDialog dialog = new MessageDialog(ContextManager.getActiveWorkbenchShell(),
                "Signature Tool is already running...", null,
                "The Signature Tool is already running.  Please exit the tool before running it again.",
                MessageDialog.WARNING, new String[] { "OK" }, 0);
        dialog.open();
    }

    /**
     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action .IAction,
     *      org.eclipse.jface.viewers.ISelection)
     */
    public void selectionChanged(IAction action, ISelection selection) {

    }
}