/* | |
* 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.dialogs; | |
import java.io.File; | |
import java.io.IOException; | |
import java.util.ArrayList; | |
import java.util.Enumeration; | |
import java.util.List; | |
import java.util.zip.ZipEntry; | |
import java.util.zip.ZipFile; | |
import org.eclipse.jface.dialogs.TitleAreaDialog; | |
import org.eclipse.jface.viewers.CheckStateChangedEvent; | |
import org.eclipse.jface.viewers.CheckboxTableViewer; | |
import org.eclipse.jface.viewers.IBaseLabelProvider; | |
import org.eclipse.jface.viewers.ICheckStateListener; | |
import org.eclipse.jface.viewers.IContentProvider; | |
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.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.Control; | |
import org.eclipse.swt.widgets.DirectoryDialog; | |
import org.eclipse.swt.widgets.Display; | |
import org.eclipse.swt.widgets.FileDialog; | |
import org.eclipse.swt.widgets.Group; | |
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.log.StudioLogger; | |
import com.motorolamobility.studio.android.certmanager.CertificateManagerActivator; | |
import com.motorolamobility.studio.android.certmanager.command.BackupHandler; | |
import com.motorolamobility.studio.android.certmanager.i18n.CertificateManagerNLS; | |
public class RestoreBackupDialog extends TitleAreaDialog | |
{ | |
private static final String ZIP_EXT = "*.zip"; //$NON-NLS-1$ | |
private static final String WIZARD_BANNER = "icons/wizban/restore_keystore_wiz.png"; //$NON-NLS-1$ | |
public static final String RESTORE_KEYSTORE_HELP_ID = CertificateManagerActivator.PLUGIN_ID | |
+ ".restore_keystore"; //$NON-NLS-1$ | |
private final IContentProvider contentProvider; | |
private final IBaseLabelProvider labelProvider; | |
private CheckboxTableViewer tableViewer; | |
private final String title; | |
private File archiveFile; | |
private List<String> selectedKeyStores; | |
private File destinationFile; | |
private Button selectAllButton; | |
private String destinationPath = ""; //$NON-NLS-1$ | |
public RestoreBackupDialog(Shell parentShell) | |
{ | |
super(parentShell); | |
setShellStyle(getShellStyle() | SWT.RESIZE); | |
this.contentProvider = new BackupContentProvider(); | |
this.labelProvider = new BackupLabelProvider(); | |
this.title = CertificateManagerNLS.RestoreBackupDialog_Dialog_Title; | |
selectedKeyStores = new ArrayList<String>(); | |
setTitleImage(CertificateManagerActivator.imageDescriptorFromPlugin( | |
CertificateManagerActivator.PLUGIN_ID, WIZARD_BANNER).createImage()); | |
} | |
@Override | |
protected Control createDialogArea(Composite parent) | |
{ | |
getShell().setText(title); | |
setTitle(CertificateManagerNLS.RestoreBackupDialog_TitleArea_Message); | |
PlatformUI.getWorkbench().getHelpSystem() | |
.setHelp(getShell(), RestoreBackupDialog.RESTORE_KEYSTORE_HELP_ID); | |
Composite dialogArea = new Composite(parent, SWT.FILL); | |
dialogArea.setLayout(new GridLayout()); | |
dialogArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | |
Group pathGroup = new Group(dialogArea, SWT.SHADOW_NONE); | |
pathGroup.setText(CertificateManagerNLS.RestoreBackupDialog_Path_Group); | |
pathGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | |
pathGroup.setLayout(new GridLayout(3, false)); | |
Label pathLabel = new Label(pathGroup, SWT.NONE); | |
pathLabel.setText(CertificateManagerNLS.RestoreBackupDialog_BackUp_File); | |
pathLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); | |
final Text pathText = new Text(pathGroup, SWT.BORDER); | |
pathText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); | |
pathText.addModifyListener(new ModifyListener() | |
{ | |
@Override | |
public void modifyText(ModifyEvent e) | |
{ | |
archiveFile = new File(pathText.getText()); | |
selectAllButton.setSelection(false); | |
validate(); | |
loadArchiveEntries(); | |
} | |
}); | |
Button browseButton = new Button(pathGroup, SWT.PUSH); | |
browseButton.setText(CertificateManagerNLS.RestoreBackupDialog_Browse_Button); | |
browseButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); | |
browseButton.addSelectionListener(new SelectionAdapter() | |
{ | |
@Override | |
public void widgetSelected(SelectionEvent e) | |
{ | |
FileDialog fileDialog = new FileDialog(getShell()); | |
fileDialog.setFilterExtensions(new String[] | |
{ | |
ZIP_EXT | |
}); | |
fileDialog.setOverwrite(false); | |
String choosenPath = fileDialog.open(); | |
pathText.setText(choosenPath); | |
super.widgetSelected(e); | |
} | |
}); | |
Label destinPath = new Label(pathGroup, SWT.NONE); | |
destinPath.setText(CertificateManagerNLS.RestoreBackupDialog_Destination); | |
destinPath.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); | |
final Text destinText = new Text(pathGroup, SWT.BORDER); | |
destinText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); | |
destinText.addModifyListener(new ModifyListener() | |
{ | |
@Override | |
public void modifyText(ModifyEvent e) | |
{ | |
destinationPath = destinText.getText(); | |
destinationFile = new File(destinationPath); | |
validate(); | |
} | |
}); | |
Button destinBrowseButton = new Button(pathGroup, SWT.PUSH); | |
destinBrowseButton.setText(CertificateManagerNLS.RestoreBackupDialog_Browse_Button); | |
destinBrowseButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); | |
destinBrowseButton.addSelectionListener(new SelectionAdapter() | |
{ | |
@Override | |
public void widgetSelected(SelectionEvent e) | |
{ | |
DirectoryDialog directoryDialog = new DirectoryDialog(getShell()); | |
String choosenPath = directoryDialog.open(); | |
destinText.setText(choosenPath); | |
super.widgetSelected(e); | |
} | |
}); | |
Group keystoresGroup = new Group(dialogArea, SWT.SHADOW_NONE); | |
keystoresGroup.setText(CertificateManagerNLS.RestoreBackupDialog_KeyStores); | |
keystoresGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | |
keystoresGroup.setLayout(new GridLayout(1, false)); | |
tableViewer = | |
CheckboxTableViewer.newCheckList(keystoresGroup, SWT.H_SCROLL | SWT.V_SCROLL | |
| SWT.CHECK | SWT.BORDER); | |
tableViewer.setContentProvider(contentProvider); | |
tableViewer.setLabelProvider(labelProvider); | |
GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); | |
layoutData.widthHint = 400; | |
layoutData.heightHint = 200; | |
tableViewer.getControl().setLayoutData(layoutData); | |
tableViewer.addCheckStateListener(new ICheckStateListener() | |
{ | |
@Override | |
public void checkStateChanged(CheckStateChangedEvent event) | |
{ | |
String keyStore = null; | |
Object element = event.getElement(); | |
if (element instanceof String) | |
{ | |
keyStore = (String) element; | |
} | |
if (keyStore != null) | |
{ | |
if (event.getChecked()) | |
{ | |
selectedKeyStores.add(keyStore); | |
} | |
else | |
{ | |
selectedKeyStores.remove(keyStore); | |
} | |
} | |
if (tableViewer.getCheckedElements().length == tableViewer.getTable().getItems().length) | |
{ | |
selectAllButton.setSelection(true); | |
} | |
else | |
{ | |
selectAllButton.setSelection(false); | |
} | |
validate(); | |
} | |
}); | |
Composite selectButtonArea = new Composite(keystoresGroup, SWT.NONE); | |
selectButtonArea.setLayout(new GridLayout(1, true)); | |
selectButtonArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | |
selectAllButton = new Button(selectButtonArea, SWT.CHECK); | |
selectAllButton.setText(CertificateManagerNLS.RestoreBackupDialog_Select_All); | |
selectAllButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); | |
selectAllButton.addSelectionListener(new SelectionAdapter() | |
{ | |
@Override | |
public void widgetSelected(SelectionEvent e) | |
{ | |
tableViewer.setAllChecked(selectAllButton.getSelection()); | |
selectedKeyStores.clear(); | |
for (Object element : tableViewer.getCheckedElements()) | |
{ | |
String keyStoreEl = (String) element; | |
selectedKeyStores.add(keyStoreEl); | |
} | |
validate(); | |
super.widgetSelected(e); | |
} | |
}); | |
setMessage(CertificateManagerNLS.RestoreBackupDialog_Default_Message); | |
return dialogArea; | |
} | |
protected void loadArchiveEntries() | |
{ | |
Runnable loadRunnable = new Runnable() | |
{ | |
@Override | |
public void run() | |
{ | |
if (archiveFile.exists()) | |
{ | |
@SuppressWarnings("rawtypes") | |
final List[] holderArray = new List[1]; | |
ZipFile zipFile = null; | |
try | |
{ | |
zipFile = new ZipFile(archiveFile, ZipFile.OPEN_READ); | |
ArrayList<String> keyStores = new ArrayList<String>(zipFile.size()); | |
holderArray[0] = keyStores; | |
Enumeration<? extends ZipEntry> entries = zipFile.entries(); | |
while (entries.hasMoreElements()) | |
{ | |
ZipEntry zipEntry = entries.nextElement(); | |
if (!zipEntry.getName().equalsIgnoreCase( | |
BackupHandler.KS_TYPES_FILENAME)) | |
{ | |
keyStores.add(zipEntry.getName()); | |
} | |
} | |
Display.getDefault().syncExec(new Runnable() | |
{ | |
@Override | |
public void run() | |
{ | |
tableViewer.setInput(holderArray[0]); | |
} | |
}); | |
} | |
catch (Exception e) | |
{ | |
Display.getDefault().asyncExec(new Runnable() | |
{ | |
@Override | |
public void run() | |
{ | |
clearKeystoresTableViewer(); | |
setErrorMessage(NLS | |
.bind(CertificateManagerNLS.RestoreBackupDialog_Error_Loading_Entries, | |
archiveFile)); | |
getButton(OK).setEnabled(false); | |
} | |
}); | |
} | |
finally | |
{ | |
if (zipFile != null) | |
{ | |
try | |
{ | |
zipFile.close(); | |
} | |
catch (IOException e) | |
{ | |
StudioLogger | |
.error("Could not close stream while restoring backup. " | |
+ e.getMessage()); | |
} | |
} | |
} | |
} | |
} | |
}; | |
Thread thread = new Thread(loadRunnable); | |
thread.start(); | |
} | |
@Override | |
protected Control createButtonBar(Composite parent) | |
{ | |
Control buttonBar = super.createButtonBar(parent); | |
getButton(OK).setEnabled(false); | |
return buttonBar; | |
} | |
private void validate() | |
{ | |
boolean isValid = true; | |
if (!archiveFile.exists()) | |
{ | |
clearKeystoresTableViewer(); | |
setErrorMessage(CertificateManagerNLS.RestoreBackupDialog_BackUpFile_Not_Exist); | |
isValid = false; | |
} | |
else | |
{ | |
setErrorMessage(null); | |
isValid = true; | |
} | |
if (isValid) | |
{ | |
if (destinationPath.isEmpty()) | |
{ | |
setErrorMessage(CertificateManagerNLS.RestoreBackupDialog_Invalid_Dest_Path); | |
isValid = false; | |
} | |
else | |
{ | |
if ((destinationFile != null) && destinationFile.isFile()) | |
{ | |
setErrorMessage(CertificateManagerNLS.RestoreBackupDialog_Invalid_Dest_Path); | |
isValid = false; | |
} | |
else | |
{ | |
setErrorMessage(null); | |
isValid = true; | |
} | |
} | |
} | |
if (isValid) | |
{ | |
if (selectedKeyStores.isEmpty()) | |
{ | |
setErrorMessage(CertificateManagerNLS.RestoreBackupDialog_Select_KeyStore); | |
isValid = false; | |
} | |
else | |
{ | |
setErrorMessage(null); | |
isValid = true; | |
} | |
} | |
getButton(OK).setEnabled(isValid); | |
} | |
/** | |
* Remove all entries from keystores table viewer. | |
* */ | |
private void clearKeystoresTableViewer() | |
{ | |
tableViewer.setInput(null); | |
} | |
/** | |
* @return The back archive file | |
*/ | |
public File getArchiveFile() | |
{ | |
return archiveFile; | |
} | |
/** | |
* @return The keystores to be restored | |
*/ | |
public List<String> getSelectedKeyStores() | |
{ | |
return selectedKeyStores; | |
} | |
/** | |
* @return The destination directory | |
*/ | |
public File getDestinationDir() | |
{ | |
return destinationFile; | |
} | |
} |