/* * 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.ui.dialogs.connection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.model.IDataSourceContainerProvider; import org.jkiss.dbeaver.model.connection.DBPDriver; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.model.struct.DBSWrapper; import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.DataSourceProviderRegistry; import org.jkiss.dbeaver.registry.DataSourceRegistry; import org.jkiss.dbeaver.registry.driver.DriverDescriptor; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.dialogs.driver.DriverTreeControl; import java.util.*; /** * Connection migration wizard */ public class MigrateConnectionWizard extends Wizard { private final DataSourceRegistry registry; private final Set<DBPDataSourceContainer> selectedConnections = new HashSet<>(); private PageConnections pageConnections; private PageDriver pageDriver; public MigrateConnectionWizard(DataSourceRegistry registry, IStructuredSelection selection) { this.registry = registry; if (selection != null && !selection.isEmpty()) { for (Iterator<?> iter = selection.iterator(); iter.hasNext(); ) { Object item = iter.next(); if (item instanceof IDataSourceContainerProvider) { selectedConnections.add(((IDataSourceContainerProvider) item).getDataSourceContainer()); } else if (item instanceof DBPDataSourceContainer) { selectedConnections.add((DBPDataSourceContainer) item); } else if (item instanceof DBSObject) { selectedConnections.add(((DBSObject) item).getDataSource().getContainer()); } else if (item instanceof DBSWrapper) { selectedConnections.add(((DBSWrapper) item).getObject().getDataSource().getContainer()); } } } setWindowTitle(CoreMessages.dialog_migrate_wizard_window_title); } /** * Adding the page to the wizard. */ @Override public void addPages() { pageConnections = new PageConnections(); pageDriver = new PageDriver(); addPage(pageConnections); addPage(pageDriver); } @Override public IWizardPage getStartingPage() { if (!selectedConnections.isEmpty()) { return pageDriver; } else { return pageConnections; } } @Override public boolean performFinish() { final List<DataSourceDescriptor> connections = pageConnections.getSelectedConnections(); final DriverDescriptor targetDriver = pageDriver.selectedDriver; for (DataSourceDescriptor conn : connections) { conn.setDriver(targetDriver); conn.getRegistry().updateDataSource(conn); } return true; } class PageConnections extends WizardPage { private Table connectionsViewer; protected PageConnections() { super(CoreMessages.dialog_migrate_wizard_name); setTitle(CoreMessages.dialog_migrate_wizard_start_title); setDescription(CoreMessages.dialog_migrate_wizard_start_description); } @Override public void createControl(Composite parent) { connectionsViewer = new Table(parent, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.CHECK); connectionsViewer.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { getContainer().updateButtons(); } @Override public void widgetDefaultSelected(SelectionEvent e) { getContainer().showPage(getNextPage()); } }); if (registry != null) { for (DataSourceDescriptor ds : registry.getDataSources()) { TableItem item = new TableItem(connectionsViewer, SWT.NONE); item.setText(ds.getName()); item.setData(ds); item.setImage(DBeaverIcons.getImage(ds.getDriver().getIcon())); if (selectedConnections.contains(ds)) { item.setChecked(true); } } } setControl(connectionsViewer); } @Override public boolean isPageComplete() { for (TableItem item : connectionsViewer.getItems()) { if (item.getChecked()) { return true; } } return false; } public List<DataSourceDescriptor> getSelectedConnections() { final List<DataSourceDescriptor> result = new ArrayList<>(); for (TableItem item : connectionsViewer.getItems()) { if (item.getChecked()) { result.add((DataSourceDescriptor) item.getData()); } } return result; } } class PageDriver extends WizardPage implements ISelectionChangedListener { private DriverDescriptor selectedDriver; private DriverTreeControl driverTreeControl; PageDriver() { super("migrateConnectionDriver"); //$NON-NLS-1$ setTitle(CoreMessages.dialog_migrate_wizard_choose_driver_title); setDescription(CoreMessages.dialog_migrate_wizard_choose_driver_description); } @Override public void createControl(Composite parent) { Composite placeholder = UIUtils.createPlaceholder(parent, 1); driverTreeControl = new DriverTreeControl(placeholder, this, DataSourceProviderRegistry.getInstance().getDataSourceProviders(), true); GridData gd = new GridData(GridData.FILL_BOTH); gd.heightHint = 200; driverTreeControl.setLayoutData(gd); setControl(placeholder); } @Override public boolean isPageComplete() { return this.selectedDriver != null; } @Override public void selectionChanged(SelectionChangedEvent event) { this.selectedDriver = null; ISelection selection = event.getSelection(); if (selection instanceof IStructuredSelection) { Object selectedObject = ((IStructuredSelection) selection).getFirstElement(); if (selectedObject instanceof DBPDriver) { selectedDriver = (DriverDescriptor) selectedObject; } } getWizard().getContainer().updateButtons(); } } }