org.jkiss.dbeaver.ext.mockdata.MockDataWizardPageSettings.java Source code

Java tutorial

Introduction

Here is the source code for org.jkiss.dbeaver.ext.mockdata.MockDataWizardPageSettings.java

Source

/*
 * DBeaver - Universal Database Manager
 * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
 * Copyright (C) 2010-2017 Eugene Fradkin (eugene.fradkin@gmail.com)
 *
 * 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.ext.mockdata;

import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ext.mockdata.MockDataSettings.AttributeGeneratorProperties;
import org.jkiss.dbeaver.ext.mockdata.model.MockGeneratorDescriptor;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.DBValueFormatting;
import org.jkiss.dbeaver.model.struct.DBSAttributeBase;
import org.jkiss.dbeaver.runtime.properties.PropertySourceCustom;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIIcon;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.CustomComboBoxCellEditor;
import org.jkiss.dbeaver.ui.dialogs.ActiveWizardPage;
import org.jkiss.dbeaver.ui.properties.PropertyTreeViewer;
import org.jkiss.utils.CommonUtils;

import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.*;
import java.util.List;

public class MockDataWizardPageSettings extends ActiveWizardPage<MockDataExecuteWizard> {
    private static final Log log = Log.getLog(MockDataWizardPageSettings.class);
    public static final int DEFAULT_NAME_COLUMN_WIDTH = 110;

    private MockDataSettings mockDataSettings;

    private CLabel noGeneratorInfoLabel;
    private Text entityNameText;
    private Button removeOldDataCheck;
    private Text rowsText;

    private PropertyTreeViewer propsEditor;
    private PropertySourceCustom propertySource;
    private TableViewer generatorsTableViewer;
    private DBSAttributeBase selectedAttribute;
    private boolean firstInit = true;
    private Combo generatorCombo;
    private Label generatorDescriptionLabel;
    private Link generatorDescriptionLink;
    private Font boldFont;

    private String generatorLinkUrl;

    protected MockDataWizardPageSettings(MockDataSettings mockDataSettings) {
        super(MockDataMessages.tools_mockdata_wizard_page_settings_page_name);
        setTitle(MockDataMessages.tools_mockdata_wizard_page_settings_page_name);
        setDescription((MockDataMessages.tools_mockdata_wizard_page_settings_page_description));
        this.mockDataSettings = mockDataSettings;
    }

    public void createControl(Composite parent) {
        Composite composite = UIUtils.createPlaceholder(parent, 1);

        {
            SelectionListener changeListener = new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    updateState();
                }
            };

            Composite entityPlaceholder = UIUtils.createPlaceholder(composite, 2);
            this.entityNameText = UIUtils.createLabelText(entityPlaceholder,
                    MockDataMessages.tools_mockdata_wizard_page_settings_text_entity, "", SWT.NONE | SWT.READ_ONLY);
            GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
            gd.widthHint = 230;
            gd.verticalIndent = 5;
            gd.horizontalIndent = 9;
            entityPlaceholder.setLayoutData(gd);

            Group settingsGroup = UIUtils.createControlGroup(composite,
                    MockDataMessages.tools_mockdata_wizard_page_settings_group_settings, 4,
                    GridData.FILL_HORIZONTAL, 0);
            gd = new GridData(GridData.FILL_HORIZONTAL);
            gd.verticalIndent = 5;
            settingsGroup.setLayoutData(gd);

            this.removeOldDataCheck = UIUtils.createCheckbox(settingsGroup,
                    MockDataMessages.tools_mockdata_wizard_page_settings_checkbox_remove_old_data, null,
                    mockDataSettings.isRemoveOldData(), 4);
            removeOldDataCheck.addSelectionListener(changeListener);

            this.rowsText = UIUtils.createLabelText(settingsGroup,
                    MockDataMessages.tools_mockdata_wizard_page_settings_combo_rows,
                    String.valueOf(mockDataSettings.getRowsNumber()), SWT.BORDER, new GridData(110, SWT.DEFAULT));
            rowsText.addSelectionListener(changeListener);
            rowsText.addVerifyListener(UIUtils.getLongVerifyListener(rowsText));
            rowsText.addModifyListener(new ModifyListener() {
                @Override
                public void modifyText(ModifyEvent e) {
                    updateState();
                }
            });
        }

        {
            Group generatorsGroup = UIUtils.createControlGroup(composite,
                    MockDataMessages.tools_mockdata_wizard_page_settings_group_generators, 5, GridData.FILL_BOTH,
                    0);
            GridData gd = new GridData(GridData.FILL_BOTH);
            gd.verticalIndent = 5;
            generatorsGroup.setLayoutData(gd);

            Composite placeholder = UIUtils.createPlaceholder(generatorsGroup, 1);
            gd = new GridData(GridData.FILL_VERTICAL);
            gd.widthHint = 250;
            placeholder.setLayoutData(gd);

            Button autoAssignButton = new Button(placeholder, SWT.PUSH);
            autoAssignButton.setText(MockDataMessages.tools_mockdata_wizard_page_settings_button_autoassign);
            autoAssignButton.setImage(DBeaverIcons.getImage(UIIcon.OBJ_REFRESH));
            autoAssignButton.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    if (UIUtils.confirmAction(getShell(), MockDataMessages.tools_mockdata_wizard_title,
                            MockDataMessages.tools_mockdata_wizard_page_settings_button_autoassign_confirm)) {
                        autoAssignGenerators();
                    }
                }
            });
            gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
            //            gd.horizontalIndent = 5;
            autoAssignButton.setLayoutData(gd);

            generatorsTableViewer = new TableViewer(placeholder, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
            final Table table = generatorsTableViewer.getTable();

            gd = new GridData(GridData.FILL_BOTH);
            gd.verticalIndent = 5;
            table.setLayoutData(gd);
            table.setHeaderVisible(true);
            table.setLinesVisible(true);

            generatorsTableViewer.setContentProvider(new IStructuredContentProvider() {
                @Override
                public void dispose() {
                }

                @Override
                public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                }

                @Override
                public Object[] getElements(Object inputElement) {
                    if (inputElement instanceof Collection) {
                        return ((Collection<?>) inputElement).toArray();
                    }
                    return new Object[0];
                }
            });

            CellLabelProvider labelProvider = new CellLabelProvider() {
                @Override
                public void update(ViewerCell cell) {
                    DBSAttributeBase attribute = (DBSAttributeBase) cell.getElement();
                    AttributeGeneratorProperties attributeGeneratorProperties = mockDataSettings
                            .getAttributeGeneratorProperties(attribute);
                    if (cell.getColumnIndex() == 0) {
                        cell.setImage(DBeaverIcons.getImage(DBValueFormatting.getTypeImage(attribute)));
                        cell.setText(attribute.getName());
                        try {
                            if (DBUtils.checkUnique(mockDataSettings.getMonitor(), mockDataSettings.getEntity(),
                                    attribute) != null) {
                                cell.setFont(boldFont);
                            }
                        } catch (DBException e) {
                            log.error("Error checking the attribute '" + attribute.getName() + "' properties", e);
                        }
                        if (attributeGeneratorProperties != null && attributeGeneratorProperties.isEmpty()) {
                            cell.setForeground(table.getDisplay().getSystemColor(SWT.COLOR_RED));
                            noGeneratorInfoLabel.setVisible(true);
                        }
                    } else {
                        if (attributeGeneratorProperties != null && !attributeGeneratorProperties.isEmpty()) {
                            String selectedGeneratorId = attributeGeneratorProperties.getSelectedGeneratorId();
                            String label = mockDataSettings.getGeneratorDescriptor(selectedGeneratorId).getLabel();
                            cell.setText(label.trim());
                        }
                    }
                }
            };

            TableViewerColumn attributeColumn = new TableViewerColumn(generatorsTableViewer, SWT.LEFT);
            attributeColumn.setLabelProvider(labelProvider);
            attributeColumn.getColumn()
                    .setText(MockDataMessages.tools_mockdata_wizard_page_settings_generatorselector_attribute);

            TableViewerColumn generatorColumn = new TableViewerColumn(generatorsTableViewer, SWT.LEFT);
            generatorColumn.setLabelProvider(labelProvider);
            TableColumn column = generatorColumn.getColumn();
            column.setText(MockDataMessages.tools_mockdata_wizard_page_settings_generatorselector_generator);

            generatorColumn.setEditingSupport(new EditingSupport(generatorsTableViewer) {
                @Override
                protected CellEditor getCellEditor(Object element) {
                    DBSAttributeBase attribute = (DBSAttributeBase) element;

                    AttributeGeneratorProperties attributeGenerators = mockDataSettings
                            .getAttributeGeneratorProperties(attribute);
                    Set<String> generators = new LinkedHashSet<>();
                    if (attributeGenerators.isEmpty()) {
                        noGeneratorInfoLabel.setVisible(true);
                        TextCellEditor textCellEditor = new TextCellEditor(generatorsTableViewer.getTable());
                        textCellEditor.getControl().setEnabled(false);
                        return textCellEditor;
                    } else {
                        for (String generatorId : attributeGenerators.getGenerators()) {
                            generators.add(mockDataSettings.getGeneratorDescriptor(generatorId).getLabel());
                        }

                        CustomComboBoxCellEditor customComboBoxCellEditor = new CustomComboBoxCellEditor(
                                generatorsTableViewer, generatorsTableViewer.getTable(),
                                generators.toArray(new String[generators.size()]), SWT.BORDER | SWT.READ_ONLY);
                        return customComboBoxCellEditor;
                    }
                }

                @Override
                protected boolean canEdit(Object element) {
                    return true;
                } // disable the generator selection

                @Override
                protected Object getValue(Object element) {
                    DBSAttributeBase attribute = (DBSAttributeBase) element;
                    String selectedGenerator = mockDataSettings.getAttributeGeneratorProperties(attribute)
                            .getSelectedGeneratorId();
                    if (selectedGenerator != null) {
                        return mockDataSettings.getGeneratorDescriptor(selectedGenerator).getLabel();
                    } else {
                        return "";
                    }
                }

                @Override
                protected void setValue(Object element, Object value) {
                    DBSAttributeBase attribute = (DBSAttributeBase) element;
                    selectGenerator(attribute, (String) value);
                }
            });

            table.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    saveGeneratorProperties();
                    reloadProperties((DBSAttributeBase) e.item.getData(), null);
                }
            });

            // generator properties
            placeholder = UIUtils.createPlaceholder(generatorsGroup, 1);
            placeholder.setLayoutData(new GridData(GridData.FILL_BOTH));

            Composite labelCombo = UIUtils.createPlaceholder(placeholder, 5);
            gd = new GridData(GridData.FILL_HORIZONTAL);
            labelCombo.setLayoutData(gd);

            generatorCombo = new Combo(labelCombo, SWT.READ_ONLY | SWT.DROP_DOWN);
            gd = new GridData();
            gd.widthHint = 80;
            generatorCombo.setLayoutData(gd);
            generatorCombo.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    selectGenerator(selectedAttribute, generatorCombo.getText());
                }
            });

            Composite descriptionCombo = UIUtils.createPlaceholder(labelCombo, 2);
            gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
            descriptionCombo.setLayoutData(gd);

            generatorDescriptionLabel = new Label(descriptionCombo, SWT.NONE);
            generatorDescriptionLabel
                    .setFont(JFaceResources.getFontRegistry().getItalic(JFaceResources.DEFAULT_FONT));
            generatorDescriptionLabel.setText("");
            gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
            gd.horizontalIndent = 5;
            generatorDescriptionLabel.setLayoutData(gd);

            generatorDescriptionLink = UIUtils.createLink(descriptionCombo, "", new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    if (!CommonUtils.isEmpty(generatorLinkUrl)) {
                        IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
                        try {
                            support.getExternalBrowser().openURL(new URL(generatorLinkUrl));
                        } catch (Exception ex) {
                        }
                    }
                }
            });
            gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
            gd.horizontalIndent = 5;
            generatorDescriptionLink.setLayoutData(gd);

            Button resetButton = new Button(labelCombo, SWT.PUSH);
            resetButton.setText(MockDataMessages.tools_mockdata_wizard_page_settings_button_reset);
            resetButton.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    for (Object key : propertySource.getProperties().keySet()) {
                        propertySource.resetPropertyValueToDefault(key);
                    }
                    propsEditor.loadProperties(propertySource);
                    generatorsTableViewer.refresh(true, true);
                }
            });
            gd = new GridData();
            gd.horizontalIndent = 5;
            resetButton.setLayoutData(gd);

            propsEditor = new PropertyTreeViewer(placeholder, SWT.BORDER);
            gd = new GridData(GridData.FILL_BOTH);
            gd.verticalIndent = 5;
            propsEditor.getControl().setLayoutData(gd);

            noGeneratorInfoLabel = UIUtils.createInfoLabel(composite,
                    MockDataMessages.tools_mockdata_wizard_page_settings_button_info_notfound);
            //noGeneratorInfoLabel.setForeground(generatorsTableViewer.getDisplay().getSystemColor(SWT.COLOR_RED));
            gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
            gd.horizontalSpan = 2;
            gd.verticalIndent = 5;
            noGeneratorInfoLabel.setLayoutData(gd);
            noGeneratorInfoLabel.setVisible(false);

            table.addControlListener(new ControlAdapter() {
                @Override
                public void controlResized(ControlEvent e) {
                    UIUtils.packColumns(table);
                    UIUtils.maxTableColumnsWidth(table);
                    table.removeControlListener(this);
                }
            });
        }

        setControl(composite);

        boldFont = UIUtils.makeBoldFont(generatorsTableViewer.getControl().getFont());
    }

    private void autoAssignGenerators() {
        Map<String, AttributeGeneratorProperties> attributeGenerators = mockDataSettings.getAttributeGenerators();
        for (String attrName : attributeGenerators.keySet()) {
            mockDataSettings.autoAssignGenerator(attributeGenerators.get(attrName));
        }
        generatorsTableViewer.refresh(true, true);
    }

    private void selectGenerator(DBSAttributeBase attribute, String generatorName) {
        MockGeneratorDescriptor generatorForName = mockDataSettings.findGeneratorForName(attribute, generatorName);
        if (generatorForName != null) {
            saveGeneratorProperties();
            reloadProperties(attribute, generatorForName.getId());
        }
        generatorsTableViewer.refresh(true, true);
    }

    @Override
    public void activatePage() {

        // init the generators properties
        if (firstInit) {
            try {
                UIUtils.run(this.getContainer(), true, true, monitor -> {
                    try {
                        firstInit = false;
                        MockDataExecuteWizard wizard = getWizard();
                        mockDataSettings.init(monitor, wizard);
                        wizard.loadSettings();
                    } catch (DBException ex) {
                        throw new InvocationTargetException(ex);
                    }
                });
            } catch (InvocationTargetException ex) {
                log.error("Error Mock Data Settings initialization", ex.getTargetException());
            } catch (InterruptedException e) {
                log.error("Mock Data Settings initialization interrupted", e);
            }

            removeOldDataCheck.setSelection(mockDataSettings.isRemoveOldData());
            rowsText.setText(String.valueOf(mockDataSettings.getRowsNumber()));
            generatorsTableViewer.setInput(mockDataSettings.getAttributes());
        }

        entityNameText.setText(DBUtils.getObjectFullName(mockDataSettings.getEntity(), DBPEvaluationContext.DML));
        propsEditor.getControl().setFocus();

        // select the attributes table item
        final Table table = generatorsTableViewer.getTable();
        if (table.getItemCount() > 0) {
            int selectedItemIndex = 0;
            TableItem selectedItem = null;
            String selectedAttribute = mockDataSettings.getSelectedAttribute();
            if (selectedAttribute != null) {
                for (int i = 0; i < table.getItemCount(); i++) {
                    if (selectedAttribute.equals(table.getItem(i).getText())) {
                        selectedItemIndex = i;
                        selectedItem = table.getItem(i);
                        break;
                    }
                }
            }
            table.select(selectedItemIndex);
            if (selectedItem != null) {
                table.showItem(selectedItem);
            }
            // and notify the listeners
            Event event = new Event();
            event.widget = table;
            event.display = table.getDisplay();
            event.item = table.getItem(selectedItemIndex);
            event.type = SWT.Selection;
            table.notifyListeners(SWT.Selection, event);
        } else {
            noGeneratorInfoLabel
                    .setText(MockDataMessages.tools_mockdata_wizard_page_settings_button_info_noattributes);
            noGeneratorInfoLabel.setVisible(true);
        }

        updatePageCompletion();
    }

    @Override
    public void deactivatePage() {
        saveGeneratorProperties();
    }

    @Override
    public boolean isPageComplete() {
        return true;
    }

    public boolean validateProperties() {
        Map<String, AttributeGeneratorProperties> attributeGenerators = mockDataSettings.getAttributeGenerators();
        for (String attr : attributeGenerators.keySet()) {
            AttributeGeneratorProperties attributeGeneratorProperties = attributeGenerators.get(attr);
            String selectedGeneratorId = attributeGeneratorProperties.getSelectedGeneratorId();
            if (!CommonUtils.isEmpty(selectedGeneratorId)) {
                Map<Object, Object> properties = attributeGeneratorProperties
                        .getGeneratorPropertySource(selectedGeneratorId).getPropertiesWithDefaults();
                for (Object key : properties.keySet()) {
                    Object value = properties.get(key);
                    // all the numeric properties shouldn't be negative
                    if (value instanceof Integer && (((Integer) value) < 0)) {
                        return false;
                    }
                    if (value instanceof Long && (((Long) value) < 0)) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    private void updateState() {
        mockDataSettings.setRemoveOldData(removeOldDataCheck.getSelection());
        mockDataSettings.setRowsNumber(Long.parseLong(rowsText.getText()));
    }

    private void reloadProperties(DBSAttributeBase attribute, String generatorId) {
        AttributeGeneratorProperties attributeGeneratorProperties = mockDataSettings
                .getAttributeGeneratorProperties(attribute);
        if (generatorId == null) {
            generatorId = attributeGeneratorProperties.getSelectedGeneratorId();
        }
        if (attribute == selectedAttribute) {
            String selectedGenerator = attributeGeneratorProperties.getSelectedGeneratorId();
            if (Objects.equals(selectedGenerator, generatorId)) {
                // do nothing
                return;
            }
        }
        selectedAttribute = attribute;
        mockDataSettings.setSelectedAttribute(attribute.getName());
        generatorId = attributeGeneratorProperties.setSelectedGeneratorId(generatorId);

        // set properties
        propertySource = attributeGeneratorProperties.getGeneratorPropertySource(generatorId);
        if (propertySource != null) {
            propsEditor.loadProperties(propertySource);
            propsEditor.setExpandMode(PropertyTreeViewer.ExpandMode.FIRST);
            propsEditor.expandAll();
        } else {
            propsEditor.clearProperties();
        }

        // set the properties table columns width
        UIUtils.asyncExec(() -> {
            ((Tree) propsEditor.getControl()).getColumn(0).setWidth(DEFAULT_NAME_COLUMN_WIDTH);
            ((Tree) propsEditor.getControl()).getColumn(1)
                    .setWidth(propsEditor.getControl().getSize().x - DEFAULT_NAME_COLUMN_WIDTH - 30);
        });

        // generator combo & description
        List<String> generators = new ArrayList<>();
        for (String genId : attributeGeneratorProperties.getGenerators()) {
            MockGeneratorDescriptor generatorDescriptor = mockDataSettings.getGeneratorDescriptor(genId);
            if (generatorDescriptor != null) {
                generators.add(generatorDescriptor.getLabel());
            }
        }
        generatorDescriptionLink.setVisible(false);
        if (!generators.isEmpty()) {
            generatorCombo.setItems(generators.toArray(new String[generators.size()]));
            MockGeneratorDescriptor generatorDescriptor = mockDataSettings.getGeneratorDescriptor(generatorId);
            generatorCombo.setText(generatorDescriptor.getLabel());
            generatorCombo.setEnabled(true);
            generatorDescriptionLabel.setText(generatorDescriptor.getDescription());
            if (!CommonUtils.isEmpty(generatorDescriptor.getLink())) {
                generatorDescriptionLink.setText("<a>" + generatorDescriptor.getLink() + "</a>");
                generatorLinkUrl = generatorDescriptor.getUrl();
                generatorDescriptionLink.setVisible(true);
            }
        } else {
            generatorCombo.setItems(new String[] { MockDataMessages.tools_mockdata_wizard_page_settings_notfound });
            generatorCombo.setText(MockDataMessages.tools_mockdata_wizard_page_settings_notfound);
            generatorCombo.setEnabled(false);
            generatorDescriptionLabel.setText("");
        }
        generatorDescriptionLink.getParent().layout();
    }

    private void saveGeneratorProperties() {
        if (selectedAttribute != null) {
            AttributeGeneratorProperties attributeGeneratorProperties = mockDataSettings
                    .getAttributeGeneratorProperties(selectedAttribute);
            String selectedGenerator = attributeGeneratorProperties.getSelectedGeneratorId();
            if (selectedGenerator != null) {
                attributeGeneratorProperties.putGeneratorPropertySource(selectedGenerator, propertySource);
            }
        }
    }
}