/* * 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.scripts; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.swt.SWT; import org.eclipse.ui.IImportWizard; import org.eclipse.ui.IWorkbench; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; 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.ui.UIUtils; import org.jkiss.dbeaver.ui.editors.EditorUtils; import org.jkiss.dbeaver.ui.resources.ResourceUtils; import org.jkiss.dbeaver.utils.RuntimeUtils; import org.jkiss.utils.CommonUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import java.util.regex.Pattern; public class ScriptsImportWizard extends Wizard implements IImportWizard { private static final Log log = Log.getLog(ScriptsImportWizard.class); private ScriptsImportWizardPage pageMain; public ScriptsImportWizard() { } @Override public void init(IWorkbench workbench, IStructuredSelection selection) { setWindowTitle(CoreMessages.dialog_scripts_import_wizard_window_title); setNeedsProgressMonitor(true); } @Override public void addPages() { super.addPages(); pageMain = new ScriptsImportWizardPage(); addPage(pageMain); //addPage(new ProjectImportWizardPageFinal(data)); } @Override public boolean performFinish() { final ScriptsImportData importData = pageMain.getImportData(); final ScriptsImporter importer = new ScriptsImporter(importData); try { DBeaverUI.run(getContainer(), true, true, importer); } catch (InterruptedException ex) { return false; } catch (InvocationTargetException ex) { UIUtils.showErrorDialog( getShell(), CoreMessages.dialog_scripts_import_wizard_dialog_error_title, CoreMessages.dialog_scripts_import_wizard_dialog_error_text, ex.getTargetException()); return false; } if (importer.getImportedCount() <= 0) { UIUtils.showMessageBox(getShell(), CoreMessages.dialog_scripts_import_wizard_dialog_message_title, CoreMessages.dialog_scripts_import_wizard_dialog_message_no_scripts, SWT.ICON_WARNING); return false; } else { UIUtils.showMessageBox(getShell(), CoreMessages.dialog_scripts_import_wizard_dialog_message_title, importer.getImportedCount() + CoreMessages.dialog_scripts_import_wizard_dialog_message_success_imported, SWT.ICON_INFORMATION); return true; } } private int importScripts(DBRProgressMonitor monitor, ScriptsImportData importData) throws IOException, DBException, CoreException { List<Pattern> masks = new ArrayList<>(); StringTokenizer st = new StringTokenizer(importData.getFileMasks(), ",; "); //$NON-NLS-1$ while (st.hasMoreTokens()) { String mask = st.nextToken().trim(); if (!CommonUtils.isEmpty(mask)) { mask = mask.replace("*", ".*"); //$NON-NLS-1$ //$NON-NLS-2$ masks.add(Pattern.compile(mask)); } } List<File> filesToImport = new ArrayList<>(); collectFiles(importData.getInputDir(), masks, filesToImport); if (filesToImport.isEmpty()) { return 0; } // Use null monitor for resource actions to not break our main monitor final IProgressMonitor nullMonitor = new NullProgressMonitor(); // Import scripts int imported = filesToImport.size(); monitor.beginTask(CoreMessages.dialog_scripts_import_wizard_monitor_import_scripts, imported); for (File file : filesToImport) { // Create dirs monitor.subTask(file.getName()); List<File> path = new ArrayList<>(); for (File parent = file.getParentFile(); !parent.equals(importData.getInputDir()); parent = parent.getParentFile()) { path.add(0, parent); } // Get target dir final IResource srcResource = importData.getImportDir().getResource(); if (!(srcResource instanceof IFolder)) { log.warn("Resource '" + srcResource + "' is not a folder"); //$NON-NLS-1$ //$NON-NLS-2$ continue; } IFolder targetDir = (IFolder) srcResource; for (File folder : path) { targetDir = targetDir.getFolder(folder.getName()); if (!targetDir.exists()) { targetDir.create(true, true, nullMonitor); } } String targetName = file.getName(); if (!targetName.toLowerCase().endsWith("." + ResourceUtils.SCRIPT_FILE_EXTENSION)) { //$NON-NLS-1$ targetName += "." + ResourceUtils.SCRIPT_FILE_EXTENSION; //$NON-NLS-1$ } final IFile targetFile = targetDir.getFile(targetName); if (targetFile.exists()) { if (importData.isOverwriteFiles()) { log.warn("Overwriting file '" + targetFile.getFullPath() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ targetFile.delete(true, true, RuntimeUtils.getNestedMonitor(monitor)); } else { log.warn("File '" + targetFile.getFullPath() + "' already exists - skipped"); //$NON-NLS-1$ //$NON-NLS-2$ imported--; continue; } } // Copy file try (FileInputStream in = new FileInputStream(file)) { targetFile.create(in, true, nullMonitor); } // Set datasource if (importData.getDataSourceContainer() != null) { EditorUtils.setFileDataSource(targetFile, importData.getDataSourceContainer()); } // Done monitor.worked(1); } monitor.done(); return imported; } private void collectFiles(File inputDir, List<Pattern> masks, List<File> filesToImport) { File[] listFiles = inputDir.listFiles(); if (listFiles == null) { //!inputDir.exists() return; } for (File file : listFiles) { if (file.isDirectory()) { collectFiles(file, masks, filesToImport); } else { boolean matched = false; for (Pattern mask : masks) { if (mask.matcher(file.getName()).matches()) { matched = true; break; } } if (matched) { filesToImport.add(file); } } } } private class ScriptsImporter implements DBRRunnableWithProgress { private final ScriptsImportData importData; private int importedCount; public ScriptsImporter(ScriptsImportData importData) { this.importData = importData; } public int getImportedCount() { return importedCount; } @Override public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { importedCount = importScripts(monitor, importData); } catch (Exception e) { throw new InvocationTargetException(e); } } } }