From aeee9c16182d59b12c2eff4d09aee2e8dc4e20eb Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Sat, 17 Sep 2016 15:44:59 +0300 Subject: [PATCH] Scripts export/import wizards fixes --- .../tools/scripts/ScriptsExportUtils.java | 71 ------------------- .../tools/scripts/ScriptsExportWizard.java | 54 ++++++++++---- .../scripts/ScriptsExportWizardPage.java | 15 ++-- .../scripts/ScriptsImportWizardPage.java | 11 +-- 4 files changed, 60 insertions(+), 91 deletions(-) delete mode 100644 plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsExportUtils.java diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsExportUtils.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsExportUtils.java deleted file mode 100644 index a441ccdb1d..0000000000 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsExportUtils.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2016 Serge Rieder (serge@jkiss.org) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License (version 2) - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.jkiss.dbeaver.tools.scripts; - -import org.eclipse.core.resources.IFolder; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.runtime.CoreException; -import org.jkiss.dbeaver.DBException; -import org.jkiss.dbeaver.core.DBeaverCore; -import org.jkiss.dbeaver.Log; -import org.jkiss.dbeaver.model.navigator.DBNNode; -import org.jkiss.dbeaver.model.navigator.DBNProject; -import org.jkiss.dbeaver.model.navigator.DBNResource; -import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; -import org.jkiss.dbeaver.ui.resources.ResourceUtils; - -/** - * Utils - */ -class ScriptsExportUtils { - - private static final Log log = Log.getLog(ScriptsExportUtils.class); - - static DBNNode getScriptsNode() - { - final IProject activeProject = DBeaverCore.getInstance().getProjectRegistry().getActiveProject(); - if (activeProject == null) { - return DBeaverCore.getInstance().getNavigatorModel().getRoot(); - } - final DBNProject projectNode = DBeaverCore.getInstance().getNavigatorModel().getRoot().getProject(activeProject); - DBNNode scriptsNode = projectNode; - final IFolder scriptsFolder; - try { - scriptsFolder = ResourceUtils.getScriptsFolder(activeProject, false); - } catch (CoreException e) { - log.error(e); - return scriptsNode; - } - if (!scriptsFolder.exists()) { - return scriptsNode; - } - try { - for (DBNNode projectFolder : projectNode.getChildren(VoidProgressMonitor.INSTANCE)) { - if (projectFolder instanceof DBNResource && ((DBNResource) projectFolder).getResource().equals(scriptsFolder)) { - scriptsNode = projectFolder; - break; - } - } - } catch (DBException e) { - log.error(e); - } - return scriptsNode; - } - -} diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsExportWizard.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsExportWizard.java index 4e6df19b71..1c5e929986 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsExportWizard.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsExportWizard.java @@ -17,7 +17,6 @@ */ package org.jkiss.dbeaver.tools.scripts; -import org.jkiss.dbeaver.Log; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; @@ -26,6 +25,7 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.ui.IExportWizard; import org.eclipse.ui.IWorkbench; +import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.core.DBeaverUI; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; @@ -33,7 +33,7 @@ import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIIcon; import org.jkiss.dbeaver.ui.UIUtils; -import org.jkiss.dbeaver.utils.ContentUtils; +import org.jkiss.utils.IOUtils; import java.io.File; import java.io.FileOutputStream; @@ -41,6 +41,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.Collection; import java.util.List; public class ScriptsExportWizard extends Wizard implements IExportWizard { @@ -98,17 +99,48 @@ public class ScriptsExportWizard extends Wizard implements IExportWizard { public void exportScripts(DBRProgressMonitor monitor, final ScriptsExportData exportData) throws IOException, CoreException, InterruptedException { - for (IResource res : exportData.getScripts()) { + Collection scripts = exportData.getScripts(); + int totalFiles = 0; + for (IResource res : scripts) { + if (res instanceof IFolder) { + totalFiles += countFiles((IFolder) res); + } else { + totalFiles++; + } + } + monitor.beginTask("Export scripts", totalFiles); + for (IResource res : scripts) { if (res instanceof IFolder) { exportFolder(monitor, (IFolder)res, exportData); } else { exportScript(monitor, (IFile) res, exportData); } } + monitor.done(); + } + + private int countFiles(IFolder folder) + { + try { + int count = 0; + for (IResource res : folder.members()) { + if (res instanceof IFile) { + count++; + } else if (res instanceof IFolder) { + count += countFiles((IFolder) res); + } + } + return count; + } catch (CoreException e) { + return 0; + } } private void exportFolder(DBRProgressMonitor monitor, IFolder folder, final ScriptsExportData exportData) throws CoreException, IOException { + if (monitor.isCanceled()) { + return; + } File fsDir = makeExternalFile(folder, exportData.getOutputFolder()); if (!fsDir.exists()) { if (!fsDir.mkdirs()) { @@ -116,6 +148,9 @@ public class ScriptsExportWizard extends Wizard implements IExportWizard { } } for (IResource res : folder.members()) { + if (monitor.isCanceled()) { + return; + } if (res instanceof IFile) { exportScript(monitor, (IFile)res, exportData); } else if (res instanceof IFolder) { @@ -157,17 +192,12 @@ public class ScriptsExportWizard extends Wizard implements IExportWizard { throw new IOException("Can't create directory '" + fileDir.getAbsolutePath() + "'"); } } - final InputStream scriptContents = file.getContents(true); - try { - FileOutputStream out = new FileOutputStream(fsFile); - try { - ContentUtils.copyStreams(scriptContents, 0, out, monitor); - } finally { - ContentUtils.close(out); + try (final InputStream scriptContents = file.getContents(true)) { + try (FileOutputStream out = new FileOutputStream(fsFile)) { + IOUtils.copyStream(scriptContents, out); } - } finally { - ContentUtils.close(scriptContents); } + monitor.worked(1); } } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsExportWizardPage.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsExportWizardPage.java index 44cd10c8bb..9d67aa009c 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsExportWizardPage.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsExportWizardPage.java @@ -17,12 +17,11 @@ */ package org.jkiss.dbeaver.tools.scripts; +import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.jface.dialogs.IMessageProvider; -import org.eclipse.jface.viewers.CheckStateChangedEvent; -import org.eclipse.jface.viewers.CheckboxTreeViewer; -import org.eclipse.jface.viewers.ICheckStateListener; +import org.eclipse.jface.viewers.*; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; @@ -107,7 +106,7 @@ class ScriptsExportWizardPage extends WizardPage { placeholder.setLayout(new GridLayout(1, false)); // Project list - scriptsNavigator = new DatabaseNavigatorTree(placeholder, ScriptsExportUtils.getScriptsNode(), SWT.BORDER | SWT.CHECK); + scriptsNavigator = new DatabaseNavigatorTree(placeholder, DBeaverCore.getInstance().getNavigatorModel().getRoot(), SWT.BORDER | SWT.CHECK); GridData gd = new GridData(GridData.FILL_BOTH); scriptsNavigator.setLayoutData(gd); CheckboxTreeViewer viewer = (CheckboxTreeViewer) scriptsNavigator.getViewer(); @@ -119,6 +118,14 @@ class ScriptsExportWizardPage extends WizardPage { } }); + scriptsNavigator.getViewer().addFilter(new ViewerFilter() { + @Override + public boolean select(Viewer viewer, Object parentElement, Object element) + { + return element instanceof DBNResource && ((DBNResource) element).getResource() instanceof IContainer; + } + }); + // Output folder Composite generalSettings = UIUtils.createPlaceholder(placeholder, 3); generalSettings.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsImportWizardPage.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsImportWizardPage.java index 8567f56dad..c8ebeadc74 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsImportWizardPage.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/scripts/ScriptsImportWizardPage.java @@ -17,6 +17,7 @@ */ package org.jkiss.dbeaver.tools.scripts; +import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.jface.viewers.*; import org.eclipse.jface.wizard.WizardPage; @@ -35,7 +36,9 @@ import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.core.DBeaverCore; import org.jkiss.dbeaver.model.DBIcon; import org.jkiss.dbeaver.model.DBPDataSourceContainer; +import org.jkiss.dbeaver.model.navigator.DBNContainer; import org.jkiss.dbeaver.model.navigator.DBNNode; +import org.jkiss.dbeaver.model.navigator.DBNProject; import org.jkiss.dbeaver.model.navigator.DBNResource; import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.ProjectRegistry; @@ -71,7 +74,7 @@ class ScriptsImportWizardPage extends WizardPage { return !CommonUtils.isEmpty(directoryText.getText()) && !CommonUtils.isEmpty(extensionsText.getText()) && - importRoot instanceof DBNResource; + importRoot instanceof DBNResource && ((DBNResource) importRoot).getResource() instanceof IFolder; } @Override @@ -144,8 +147,8 @@ class ScriptsImportWizardPage extends WizardPage { } UIUtils.createControlLabel(placeholder, CoreMessages.dialog_scripts_import_wizard_label_root_folder); - importRoot = ScriptsExportUtils.getScriptsNode(); - final DatabaseNavigatorTree scriptsNavigator = new DatabaseNavigatorTree(placeholder, importRoot, SWT.BORDER | SWT.SINGLE, true); + importRoot = DBeaverCore.getInstance().getNavigatorModel().getRoot(); + final DatabaseNavigatorTree scriptsNavigator = new DatabaseNavigatorTree(placeholder, importRoot, SWT.BORDER | SWT.SINGLE, false); scriptsNavigator.setLayoutData(new GridData(GridData.FILL_BOTH)); scriptsNavigator.getViewer().addSelectionChangedListener(new ISelectionChangedListener() { @Override @@ -164,7 +167,7 @@ class ScriptsImportWizardPage extends WizardPage { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { - return element instanceof DBNResource && ((DBNResource) element).getResource() instanceof IFolder; + return element instanceof DBNResource && ((DBNResource) element).getResource() instanceof IContainer; } }); scriptsNavigator.getViewer().expandToLevel(2); -- GitLab