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