com.motorolamobility.studio.android.certmanager.ui.dialogs.RestoreBackupDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.motorolamobility.studio.android.certmanager.ui.dialogs.RestoreBackupDialog.java

Source

/*
 * 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;
    }

}