提交 aeee9c16 编写于 作者: S Serge Rider

Scripts export/import wizards fixes

上级 8c75e6c8
/*
* 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;
}
}
......@@ -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<IResource> 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);
}
}
......@@ -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));
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册