/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * 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 org.jkiss.dbeaver.tools.transfer.wizard; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.Wizard; import org.eclipse.ui.IExportWizard; import org.eclipse.ui.IWorkbench; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.core.DBeaverUI; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress; import org.jkiss.dbeaver.tools.transfer.IDataTransferConsumer; import org.jkiss.dbeaver.tools.transfer.IDataTransferProducer; import org.jkiss.dbeaver.tools.transfer.IDataTransferSettings; import org.jkiss.dbeaver.ui.UIUtils; import java.lang.reflect.InvocationTargetException; public class DataTransferWizard extends Wizard implements IExportWizard { private static final String RS_EXPORT_WIZARD_DIALOG_SETTINGS = "DataTransfer";//$NON-NLS-1$ private DataTransferSettings settings; public DataTransferWizard(@Nullable IDataTransferProducer[] producers, @Nullable IDataTransferConsumer[] consumers) { this.settings = new DataTransferSettings(producers, consumers); loadSettings(); } private void loadSettings() { IDialogSettings section = UIUtils.getDialogSettings(RS_EXPORT_WIZARD_DIALOG_SETTINGS); setDialogSettings(section); settings.loadFrom(DBeaverUI.getActiveWorkbenchWindow(), section); } public DataTransferSettings getSettings() { return settings; } public <T extends IDataTransferSettings> T getPageSettings(IWizardPage page, Class<T> type) { return type.cast(settings.getNodeSettings(page)); } @Override public void addPages() { super.addPages(); if (settings.isConsumerOptional()) { addPage(new DataTransferPagePipes()); } settings.addWizardPages(this); addPage(new DataTransferPageFinal()); } @Override public void init(IWorkbench workbench, IStructuredSelection currentSelection) { setWindowTitle(CoreMessages.data_transfer_wizard_name); setNeedsProgressMonitor(true); } @Nullable @Override public IWizardPage getNextPage(IWizardPage page) { IWizardPage[] pages = getPages(); int curIndex = -1; for (int i = 0; i < pages.length; i++) { if (pages[i] == page) { curIndex = i; break; } } if (curIndex == pages.length - 1) { return null; } if (curIndex != -1) { // Return first node config page for (int i = curIndex + 1; i < pages.length; i++) { if (settings.isPageValid(pages[i])) { return pages[i]; } } } // Final page return pages[pages.length - 1]; } @Nullable @Override public IWizardPage getPreviousPage(IWizardPage page) { IWizardPage[] pages = getPages(); int curIndex = -1; for (int i = 0; i < pages.length; i++) { if (pages[i] == page) { curIndex = i; break; } } if (curIndex == 0) { return null; } if (curIndex != -1) { for (int i = curIndex - 1; i > 0; i--) { if (settings.isPageValid(pages[i])) { return pages[i]; } } } // First page return pages[0]; } @Override public boolean canFinish() { for (IWizardPage page : getPages()) { if (settings.isPageValid(page) && !page.isPageComplete()) { return false; } if (page instanceof DataTransferPageFinal && !((DataTransferPageFinal) page).isActivated()) { return false; } } return true; } @Override public boolean performCancel() { // Save settings anyway getSettings().saveTo(getDialogSettings()); return super.performCancel(); } @Override public boolean performFinish() { // Save settings getSettings().saveTo(getDialogSettings()); // Start consumers try { DBeaverUI.run(getContainer(), true, true, new DBRRunnableWithProgress() { @Override public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { for (DataTransferPipe pipe : settings.getDataPipes()) { pipe.getConsumer().startTransfer(monitor); } } catch (DBException e) { throw new InvocationTargetException(e); } } }); } catch (InvocationTargetException e) { UIUtils.showErrorDialog(getShell(), "Transfer init failed", "Can't start data transfer", e.getTargetException()); return false; } catch (InterruptedException e) { return false; } // Run export jobs executeJobs(); // Done return true; } private void executeJobs() { // Schedule jobs for data providers int totalJobs = settings.getDataPipes().size(); if (totalJobs > settings.getMaxJobCount()) { totalJobs = settings.getMaxJobCount(); } for (int i = 0; i < totalJobs; i++) { new DataTransferJob(settings).schedule(); } } }