/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.motorolamobility.studio.android.certmanager.ui.wizards;
import java.io.File;
import java.util.List;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import com.motorola.studio.android.common.utilities.EclipseUtils;
import com.motorola.studio.android.common.utilities.FileUtil;
import com.motorolamobility.studio.android.certmanager.CertificateManagerActivator;
import com.motorolamobility.studio.android.certmanager.core.KeyStoreManager;
import com.motorolamobility.studio.android.certmanager.core.PasswordProvider;
import com.motorolamobility.studio.android.certmanager.exception.KeyStoreManagerException;
import com.motorolamobility.studio.android.certmanager.i18n.CertificateManagerNLS;
import com.motorolamobility.studio.android.certmanager.ui.model.IKeyStore;
import com.motorolamobility.studio.android.certmanager.ui.model.KeyStoreNode;
import com.motorolamobility.studio.android.certmanager.ui.model.SigningAndKeysModelManager;
public class ImportKeystorePage extends WizardPage
{
private Text keystoreFilename;
private ComboViewer keystoreType;
public static final String IMPORT_KEYSTORE_HELP_ID = CertificateManagerActivator.PLUGIN_ID
+ ".import_keystore"; //$NON-NLS-1$
private SelectionListener selectionListener = new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
validatePage();
}
};
private boolean userChangedFilename = false;
private Composite mainComposite;
private File keystoreFile;
private String keystoreTypeString;
protected boolean keystoreAlreadyMapped = false;
private IKeyStore keyStoreNode;
/**
* @param pageName
*/
protected ImportKeystorePage(String pageName)
{
super(pageName);
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent)
{
mainComposite = new Composite(parent, SWT.FILL);
mainComposite.setLayout(new GridLayout(3, false));
mainComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
setTitle(CertificateManagerNLS.ImportKeystorePage_Title);
setMessage(CertificateManagerNLS.ImportKeystorePage_Description);
createFilenameSection(mainComposite);
createKeystoreTypeSection(mainComposite);
validatePage();
setControl(mainComposite);
//set help id for this page
PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IMPORT_KEYSTORE_HELP_ID);
PlatformUI.getWorkbench().getHelpSystem().setHelp(mainComposite, IMPORT_KEYSTORE_HELP_ID);
}
private void createFilenameSection(Composite mainComposite)
{
Label keystoreFilenameLabel = new Label(mainComposite, SWT.NONE);
keystoreFilenameLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));
keystoreFilenameLabel
.setText(CertificateManagerNLS.CreateKeystorePage_KeystoreFilenameLabel);
keystoreFilename = new Text(mainComposite, SWT.SINGLE | SWT.BORDER);
keystoreFilename.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
keystoreFilename.addSelectionListener(selectionListener);
keystoreFilename.addModifyListener(new ModifyListener()
{
@Override
public void modifyText(ModifyEvent e)
{
userChangedFilename = true;
validatePage();
}
});
Button chooseLocation = new Button(mainComposite, SWT.PUSH);
chooseLocation.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1));
chooseLocation.setText(CertificateManagerNLS.CreateKeystorePage_KeystoreFilenameBrowse);
chooseLocation.addSelectionListener(new SelectionAdapter()
{
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e)
{
Shell shell = Display.getCurrent().getActiveShell();
FileDialog dialog = new FileDialog(shell, SWT.OPEN);
String keystoreFilenameStr = dialog.open();
if (keystoreFilenameStr != null)
{
keystoreFilename.setText(keystoreFilenameStr);
keystoreType.getCombo().setFocus();
}
}
});
}
private void createKeystoreTypeSection(Composite parent)
{
Label keystoreTypeLabel = new Label(parent, SWT.NONE);
keystoreTypeLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));
keystoreTypeLabel.setText(CertificateManagerNLS.CreateKeystorePage_KeystoreType);
keystoreType = new ComboViewer(parent, SWT.READ_ONLY);
keystoreType.getCombo().setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false, 1, 1));
keystoreType.setContentProvider(new IStructuredContentProvider()
{
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
//do nothing
}
@Override
public void dispose()
{
//do nothing
}
@SuppressWarnings("unchecked")
@Override
public Object[] getElements(Object inputElement)
{
return ((List<String>) inputElement).toArray();
}
});
keystoreType.setLabelProvider(new ILabelProvider()
{
@Override
public void removeListener(ILabelProviderListener listener)
{
//do nothing
}
@Override
public boolean isLabelProperty(Object element, String property)
{
return false;
}
@Override
public void dispose()
{
//do nothing
}
@Override
public void addListener(ILabelProviderListener listener)
{
//do nothing
}
@Override
public String getText(Object element)
{
return (String) element;
}
@Override
public Image getImage(Object element)
{
return null;
}
});
keystoreType.setInput(KeyStoreManager.getInstance().getAvailableTypes());
for (int i = 0; i < keystoreType.getCombo().getItemCount(); i++)
{
if (keystoreType.getCombo().getItem(i)
.compareToIgnoreCase(KeyStoreManager.getInstance().getDefaultType()) == 0)
{
keystoreType.getCombo().select(i);
}
}
keystoreType.getCombo().addModifyListener(new ModifyListener()
{
@Override
public void modifyText(ModifyEvent e)
{
validatePage();
}
});
//fill the third column with a blank label
Label separator2 = new Label(parent, SWT.NONE);
separator2.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));
}
protected boolean validatePage()
{
String errorMessage = null;
boolean pageComplete = true;
keystoreAlreadyMapped = false;
keystoreFile = new File(keystoreFilename.getText());
keystoreTypeString = keystoreType.getCombo().getText();
if (keystoreType.getCombo().getText().isEmpty())
{
errorMessage = CertificateManagerNLS.ImportKeystorePage_KeystoreTypeCannotBeEmpty;
pageComplete = false;
}
if (userChangedFilename && !keystoreFile.exists())
{
errorMessage =
NLS.bind(CertificateManagerNLS.ImportKeystorePage_FileDoesNotExist,
keystoreFilename.getText());
pageComplete = false;
}
if (keystoreFile.exists())
{
if (keystoreFile.isFile())
{
int fileSize = -1;
try
{
fileSize = FileUtil.getFileSize(keystoreFile);
}
catch (Exception e)
{
e.printStackTrace();
}
if (fileSize <= 0)
{
errorMessage =
NLS.bind(CertificateManagerNLS.ImportKeystorePage_FileEmpty,
keystoreFilename.getText());
pageComplete = false;
}
}
else if (keystoreFile.isDirectory())
{
errorMessage =
NLS.bind(
CertificateManagerNLS.ImportKeystorePage_DirectoryNotAllowedErrorMsg,
keystoreFilename.getText());
pageComplete = false;
}
}
if (keystoreFilename.getText().isEmpty())
{
errorMessage = CertificateManagerNLS.ImportKeystorePage_FilenameCannotBeEmpty;
pageComplete = false;
}
if (KeyStoreManager.getInstance().isKeystoreMapped(keystoreFile))
{
errorMessage =
NLS.bind(CertificateManagerNLS.ImportKeystorePage_KeystoreAlreadyMapped,
keystoreFilename.getText());
keystoreAlreadyMapped = true;
pageComplete = false;
}
setErrorMessage(errorMessage);
setPageComplete(pageComplete);
return pageComplete;
}
/**
* Import the keystore using the information provided by the user.
* @return True if the keystore was imported, false otherwise.
* */
protected boolean importKeystore(String password, boolean savePassword)
{
boolean successfullyImported = true;
validatePage();
if (isPageComplete())
{
KeyStoreNode keyStoreNode =
new KeyStoreNode(keystoreFile, keystoreType.getCombo().getText());
try
{
SigningAndKeysModelManager.getInstance().mapKeyStore(keyStoreNode);
if (savePassword)
{
PasswordProvider passwordProvider = new PasswordProvider(keystoreFile);
passwordProvider.saveKeyStorePassword(password);
}
}
catch (KeyStoreManagerException e)
{
//keystore already mapped
EclipseUtils.showErrorDialog(
CertificateManagerNLS.ImportKeystorePage_CouldNotImportKeystore,
e.getMessage());
successfullyImported = false;
}
}
else
{
successfullyImported = false;
}
return successfullyImported;
}
/**
* Import the keystore using the information provided by the user.
* @return True if the keystore was imported, false otherwise.
* */
public boolean importKeystore()
{
return importKeystore(null, false);
}
/**
*
* @return
*/
protected IKeyStore getSelectedKeystore()
{
if ((keyStoreNode == null)
|| !keyStoreNode.getFile().equals(keystoreFile)
|| ((keyStoreNode.getFile().equals(keystoreFile)) && keyStoreNode.getType()
.equalsIgnoreCase(keystoreTypeString)))
{
keyStoreNode = new KeyStoreNode(keystoreFile, keystoreTypeString);
}
return keyStoreNode;
}
/**
* @return the mainComposite
*/
protected Composite getMainComposite()
{
return mainComposite;
}
}