未验证 提交 e99e50b9 编写于 作者: S Serge Rider 提交者: GitHub

Merge pull request #2975 from dbeaver/#1599-mock-data_10

#1599-mock-data_10
......@@ -992,6 +992,45 @@ public class UIUtils {
return section;
}
public static void putSectionValueWithType(IDialogSettings dialogSettings, @NotNull String key, Object value) {
if (value instanceof Double) {
dialogSettings.put(key, (Double) value);
} else
if (value instanceof Float) {
dialogSettings.put(key, (Float) value);
} else
if (value instanceof Integer) {
dialogSettings.put(key, (Integer) value);
} else
if (value instanceof Long) {
dialogSettings.put(key, (Long) value);
} else
if (value instanceof String) {
dialogSettings.put(key, (String) value);
} else
if (value instanceof Boolean) {
dialogSettings.put(key, (Boolean) value);
} else {
// do nothing
}
dialogSettings.put(key + "_type", value.getClass().getSimpleName());
}
public static Object getSectionValueWithType(IDialogSettings dialogSettings, @NotNull String key) {
String type = dialogSettings.get(key + "_type");
if (type != null) {
switch (type) {
case "Double": return dialogSettings.getDouble(key);
case "Float": return dialogSettings.getFloat(key);
case "Integer": return dialogSettings.getInt(key);
case "Long": return dialogSettings.getLong(key);
case "String": return dialogSettings.get(key);
case "Boolean": return dialogSettings.getBoolean(key);
}
}
return dialogSettings.get(key);
}
@Nullable
public static IWorkbenchPartSite getWorkbenchPartSite(IServiceLocator serviceLocator)
{
......
......@@ -42,6 +42,8 @@
<propertyGroup label="General">
<property id="template" label="Template" type="string" description="Source of substrings"
defaultValue="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."/>
<property id="minLength" label="Min Length" type="integer" defaultValue="1" description="Minimum length"/>
<property id="maxLength" label="Max Length" type="integer" description="Maximum length (0 means the column length)"/>
<property id="nulls" label="NULLs" type="boolean" defaultValue="TRUE" description="Allow NULL values"/>
</propertyGroup>
......@@ -102,6 +104,22 @@
</propertyGroup>
</generator>
<generator
id="dateSequenceGenerator"
label="Sequence"
description="Adjustable sequence of dates"
class="org.jkiss.dbeaver.ext.mockdata.generator.DateSequenceGenerator">
<type kind="DATETIME"/>
<propertyGroup label="General">
<property id="startDate" label="Start date" type="string" defaultValue="${now as dd-MM-yyyy}" description="Sequence start date (DD-MM-YYYY)"/>
<property id="step" label="Increment step" type="integer" defaultValue="1" description="Sequence increment step (days)"/>
<property id="reverse" label="Reverse order" type="boolean" defaultValue="FALSE" description="Reverse sequence order"/>
<property id="nulls" label="NULLs" type="boolean" defaultValue="TRUE"/>
</propertyGroup>
</generator>
<generator
id="booleanRandomGenerator"
label="Random"
......
......@@ -17,12 +17,14 @@
*/
package org.jkiss.dbeaver.ext.mockdata;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Composite;
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.DBeaverUI;
import org.jkiss.dbeaver.ext.mockdata.model.MockGeneratorDescriptor;
import org.jkiss.dbeaver.ext.mockdata.model.MockValueGenerator;
import org.jkiss.dbeaver.model.DBUtils;
......@@ -37,6 +39,7 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSAttributeBase;
import org.jkiss.dbeaver.model.struct.DBSDataManipulator;
import org.jkiss.dbeaver.model.struct.DBSEntity;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.dialogs.tools.AbstractToolWizard;
import java.util.*;
......@@ -46,6 +49,7 @@ public class MockDataExecuteWizard extends AbstractToolWizard<DBSDataManipulato
private static final Log log = Log.getLog(MockDataExecuteWizard.class);
public static final int BATCH_SIZE = 1000;
private static final String RS_EXPORT_WIZARD_DIALOG_SETTINGS = "MockData"; //$NON-NLS-1$
private MockDataWizardPageSettings settingsPage;
private MockDataSettings mockDataSettings;
......@@ -60,7 +64,32 @@ public class MockDataExecuteWizard extends AbstractToolWizard<DBSDataManipulato
public void init(IWorkbench workbench, IStructuredSelection selection) {
setWindowTitle(task);
setNeedsProgressMonitor(true);
settingsPage = new MockDataWizardPageSettings(mockDataSettings);
}
void loadSettings() {
IDialogSettings section = UIUtils.getDialogSettings(RS_EXPORT_WIZARD_DIALOG_SETTINGS);
setDialogSettings(section);
mockDataSettings.loadFrom(section);
}
@Override
public boolean performCancel() {
// Save settings anyway
mockDataSettings.saveTo(getDialogSettings());
return super.performCancel();
}
@Override
public boolean performFinish() {
// Save settings
mockDataSettings.saveTo(getDialogSettings());
return super.performFinish();
}
@Override
......
......@@ -48,13 +48,16 @@ public class MockDataGenerateTool implements IExternalTool {
window,
wizard) {
private boolean removeOldDataConfirmed = false;
@Override
protected void finishPressed() {
if (doValidationConfirmation(getCurrentPage())) {
if (validateProperties(getCurrentPage())) {
return;
}
if (mockDataSettings.isRemoveOldData()) {
if (!UIUtils.confirmAction(getShell(), MockDataMessages.tools_mockdata_wizard_title, MockDataMessages.tools_mockdata_confirm_delete_old_data_message)) {
return;
}
}
super.finishPressed();
}
......@@ -62,27 +65,23 @@ public class MockDataGenerateTool implements IExternalTool {
protected void nextPressed() {
IWizardPage currentPage = getCurrentPage();
if (currentPage instanceof MockDataWizardPageSettings) {
if (doValidationConfirmation(currentPage)) {
if (validateProperties(currentPage)) {
return;
}
}
super.nextPressed();
}
private boolean doValidationConfirmation(IWizardPage currentPage) {
/**
* Returns TRUE if invalid
*/
private boolean validateProperties(IWizardPage currentPage) {
if (currentPage instanceof MockDataWizardPageSettings) {
if (!((MockDataWizardPageSettings) currentPage).validateProperties()) {
this.setErrorMessage("All numeric properties should be positive.");
return true;
}
}
if (mockDataSettings.isRemoveOldData() && !removeOldDataConfirmed) {
if (UIUtils.confirmAction(getShell(), MockDataMessages.tools_mockdata_wizard_title, MockDataMessages.tools_mockdata_confirm_delete_old_data_message)) {
removeOldDataConfirmed = true;
} else {
return true;
}
}
return false;
}
......
tools_mockdata_wizard_title=Mock Data Wizard
tools_mockdata_wizard_page_name=Mock Data
tools_mockdata_wizard_message_process_completed="{0}" Mock data process completed
tools_mockdata_wizard_page_name=Mock Data Generator
tools_mockdata_wizard_message_process_completed="{0}" Mock data generation process completed
tools_mockdata_wizard_page_settings_group_settings=General
tools_mockdata_wizard_page_settings_page_name=Mock Data configuration
tools_mockdata_wizard_page_settings_page_description=Set Mock Data settings
tools_mockdata_wizard_page_settings_page_name=Mock data generator configuration
tools_mockdata_wizard_page_settings_page_description=Set mock data generator settings
tools_mockdata_wizard_page_settings_checkbox_remove_old_data=Remove Old Data
tools_mockdata_generate_data_task=Generate Mock Data
tools_mockdata_confirm_delete_old_data_message=Are you sure you want to delete old data?
......@@ -17,6 +17,7 @@
*/
package org.jkiss.dbeaver.ext.mockdata;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.ext.mockdata.model.MockGeneratorDescriptor;
......@@ -24,9 +25,11 @@ import org.jkiss.dbeaver.ext.mockdata.model.MockGeneratorRegistry;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.*;
import org.jkiss.dbeaver.runtime.properties.PropertySourceCustom;
import org.jkiss.dbeaver.runtime.ui.DBUserInterface;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException;
......@@ -36,18 +39,28 @@ public class MockDataSettings {
public static final String FK_GENERATOR_ID = "fkGenerator"; //$NON-NLS-1$
public static final String PROP_REMOVE_OLD_DATA = "removeOldData"; //$NON-NLS-1$
public static final String PROP_ROWS_NUMBER = "rowsNumber"; //$NON-NLS-1$
public static final String KEY_SELECTED_GENERATOR = "selectedGenerator"; //$NON-NLS-1$
public static final String KEY_GENERATOR_SECTION = "GENERATOR_SECTION"; //$NON-NLS-1$
private DBSEntity dbsEntity;
private Collection<DBSAttributeBase> attributes;
private boolean removeOldData;
private long rowsNumber = 10;
private long rowsNumber = 1000;
private Map<String, MockGeneratorDescriptor> generatorDescriptors = new HashMap<>(); // generatorId -> MockGeneratorDescriptor
private Map<String, AttributeGeneratorProperties> attributeGenerators = new HashMap<>(); // attribute.name -> generators properties
// populate attribute generators properties map
public Collection<? extends DBSAttributeBase> init(MockDataExecuteWizard wizard) throws DBException {
public void init(MockDataExecuteWizard wizard) throws DBException {
List<DBSDataManipulator> databaseObjects = wizard.getDatabaseObjects();
DBSDataManipulator dataManipulator = databaseObjects.iterator().next(); // TODO only the first
DBSEntity dbsEntity = (DBSEntity) dataManipulator;
dbsEntity = (DBSEntity) dataManipulator;
attributes = new ArrayList<>();
final Collection<DBSAttributeBase> attributes = new ArrayList<>();
try {
DBeaverUI.run(wizard.getContainer(), true, true, new DBRRunnableWithProgress() {
@Override
......@@ -79,11 +92,12 @@ public class MockDataSettings {
});
} catch (InvocationTargetException e) {
DBUserInterface.getInstance().showError("Transfer init failed", "Can't start data transfer", e.getTargetException());
return null;
} catch (InterruptedException e) {
return null;
e.printStackTrace();
}
}
public Collection<DBSAttributeBase> getAttributes() {
return attributes;
}
......@@ -131,6 +145,59 @@ public class MockDataSettings {
return attributeGenerators.get(attribute.getName());
}
public void loadFrom(IDialogSettings dialogSettings) {
removeOldData = dialogSettings.getBoolean(PROP_REMOVE_OLD_DATA);
try {
rowsNumber = dialogSettings.getInt(PROP_ROWS_NUMBER);
} catch (NumberFormatException e) {
// do nothing
}
// load selected generators
VoidProgressMonitor voidProgressMonitor = new VoidProgressMonitor();
IDialogSettings tableSection = UIUtils.getSettingsSection(dialogSettings, dbsEntity.getName());
for (Map.Entry<String, AttributeGeneratorProperties> entry : attributeGenerators.entrySet()) {
String attributeName = entry.getKey();
IDialogSettings attributeSection = UIUtils.getSettingsSection(tableSection, attributeName);
String selectedGeneratorId = attributeSection.get(KEY_SELECTED_GENERATOR);
if (selectedGeneratorId != null) {
AttributeGeneratorProperties attrGeneratorProperties = entry.getValue();
attrGeneratorProperties.setSelectedGeneratorId(selectedGeneratorId);
PropertySourceCustom generatorPropertySource = attrGeneratorProperties.getGeneratorPropertySource(selectedGeneratorId);
IDialogSettings generatorSection = UIUtils.getSettingsSection(attributeSection, KEY_GENERATOR_SECTION);
Map<Object, Object> properties = generatorPropertySource.getPropertiesWithDefaults();
for (Map.Entry<Object, Object> propEntry : properties.entrySet()) {
Object savedValue = UIUtils.getSectionValueWithType(generatorSection, (String) propEntry.getKey());
generatorPropertySource.setPropertyValue(voidProgressMonitor, propEntry.getKey(), savedValue);
}
}
}
}
void saveTo(IDialogSettings dialogSettings) {
dialogSettings.put(PROP_REMOVE_OLD_DATA, removeOldData);
dialogSettings.put(PROP_ROWS_NUMBER, rowsNumber);
// save selected generators
IDialogSettings tableSection = UIUtils.getSettingsSection(dialogSettings, dbsEntity.getName());
for (Map.Entry<String, AttributeGeneratorProperties> attrEntry : attributeGenerators.entrySet()) {
String attributeName = attrEntry.getKey();
AttributeGeneratorProperties attrGeneratorProperties = attrEntry.getValue();
IDialogSettings attributeSection = UIUtils.getSettingsSection(tableSection, attributeName);
String selectedGeneratorId = attrGeneratorProperties.getSelectedGeneratorId();
attributeSection.put(KEY_SELECTED_GENERATOR, selectedGeneratorId);
IDialogSettings generatorSection = UIUtils.getSettingsSection(attributeSection, KEY_GENERATOR_SECTION);
PropertySourceCustom generatorPropertySource = attrGeneratorProperties.getGeneratorPropertySource(selectedGeneratorId);
Map<Object, Object> properties = generatorPropertySource.getPropertiesWithDefaults();
for (Map.Entry<Object, Object> propEntry : properties.entrySet()) {
UIUtils.putSectionValueWithType(generatorSection, (String) propEntry.getKey(), propEntry.getValue());
}
}
}
public static class AttributeGeneratorProperties {
private final DBSAttributeBase attribute;
private String selectedGeneratorId = null; // id
......
......@@ -164,18 +164,21 @@ public class MockDataWizardPageSettings extends ActiveWizardPage<MockDataExecute
if (attributeGenerators.isEmpty()) {
// TODO item.setForeground(columnsTableViewer.getDisplay().getSystemColor(SWT.COLOR_RED));
noGeneratorInfoLabel.setVisible(true);
TextCellEditor textCellEditor = new TextCellEditor(columnsTableViewer.getTable());
textCellEditor.getControl().setEnabled(false);
return textCellEditor;
} else {
for (String generatorId : attributeGenerators.getGenerators()) {
generators.add(mockDataSettings.getGeneratorDescriptor(generatorId).getLabel());
}
}
CustomComboBoxCellEditor customComboBoxCellEditor = new CustomComboBoxCellEditor(
columnsTableViewer,
columnsTableViewer.getTable(),
generators.toArray(new String[generators.size()]),
SWT.BORDER | SWT.READ_ONLY);
return customComboBoxCellEditor;
CustomComboBoxCellEditor customComboBoxCellEditor = new CustomComboBoxCellEditor(
columnsTableViewer,
columnsTableViewer.getTable(),
generators.toArray(new String[generators.size()]),
SWT.BORDER | SWT.READ_ONLY);
return customComboBoxCellEditor;
}
}
@Override
......@@ -185,7 +188,11 @@ public class MockDataWizardPageSettings extends ActiveWizardPage<MockDataExecute
protected Object getValue(Object element) {
DBSAttributeBase attribute = (DBSAttributeBase) element;
String selectedGenerator = mockDataSettings.getAttributeGeneratorProperties(attribute).getSelectedGeneratorId();
return mockDataSettings.getGeneratorDescriptor(selectedGenerator).getLabel();
if (selectedGenerator != null) {
return mockDataSettings.getGeneratorDescriptor(selectedGenerator).getLabel();
} else {
return "";
}
}
@Override
......@@ -207,26 +214,39 @@ public class MockDataWizardPageSettings extends ActiveWizardPage<MockDataExecute
Composite placeholder = UIUtils.createPlaceholder(generatorsGroup, 1);
placeholder.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite labelCombo = UIUtils.createPlaceholder(placeholder, 3);
Composite labelCombo = UIUtils.createPlaceholder(placeholder, 4);
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());
}
});
generatorDescriptionLabel = new Label(labelCombo, SWT.NONE);
generatorDescriptionLabel.setFont(
JFaceResources.getFontRegistry().getItalic(JFaceResources.DEFAULT_FONT)
);
generatorDescriptionLabel.setText("");
gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
gd.minimumWidth = 333;
gd.horizontalIndent = 5;
generatorDescriptionLabel.setLayoutData(gd);
UIUtils.createLabel(labelCombo, "Generator : ");
generatorCombo = new Combo(labelCombo, SWT.READ_ONLY | SWT.DROP_DOWN);
gd = new GridData();
gd.widthHint = 100;
generatorCombo.setLayoutData(gd);
generatorCombo.addSelectionListener(new SelectionAdapter() {
Button createButton = new Button(labelCombo, SWT.PUSH);
createButton.setText("Reset");
createButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
selectGenerator(selectedAttribute, generatorCombo.getText());
for (Object key : propertySource.getProperties().keySet()) {
propertySource.resetPropertyValueToDefault(key);
}
propsEditor.loadProperties(propertySource);
}
});
......@@ -260,8 +280,10 @@ public class MockDataWizardPageSettings extends ActiveWizardPage<MockDataExecute
private void selectGenerator(DBSAttributeBase attribute, String generatorName) {
MockGeneratorDescriptor generatorForName = mockDataSettings.findGeneratorForName(attribute, generatorName);
saveGeneratorProperties();
reloadProperties(attribute, generatorForName.getId());
if (generatorForName != null) {
saveGeneratorProperties();
reloadProperties(attribute, generatorForName.getId());
}
columnsTableViewer.refresh(true, true);
}
......@@ -272,8 +294,13 @@ public class MockDataWizardPageSettings extends ActiveWizardPage<MockDataExecute
// init the generators properties
if (firstInit) {
firstInit = false;
Collection<? extends DBSAttributeBase> attributes = this.mockDataSettings.init(getWizard());
columnsTableViewer.setInput(attributes);
MockDataExecuteWizard wizard = getWizard();
mockDataSettings.init(wizard);
wizard.loadSettings();
removeOldDataCheck.setSelection(mockDataSettings.isRemoveOldData());
rowsText.setText(String.valueOf(mockDataSettings.getRowsNumber()));
columnsTableViewer.setInput(mockDataSettings.getAttributes());
}
// select the first item
......
......@@ -46,21 +46,21 @@ public class DateRandomGenerator extends AbstractMockValueGenerator {
public void init(DBSDataManipulator container, DBSAttributeBase attribute, Map<Object, Object> properties) throws DBException {
super.init(container, attribute, properties);
String fromD = (String) properties.get("startDate"); //$NON-NLS-1$
if (fromD != null) {
String fromDate = (String) properties.get("startDate"); //$NON-NLS-1$
if (fromDate != null) {
try {
this.startDate = DATE_FORMAT.parse(fromD).getTime();
this.startDate = DATE_FORMAT.parse(fromDate).getTime();
} catch (ParseException e) {
log.error("Error parse From Date '" + fromD + "'.", e);
log.error("Error parse Start Date '" + fromDate + "'.", e);
}
}
String toD = (String) properties.get("endDate"); //$NON-NLS-1$
if (toD != null) {
String toDate = (String) properties.get("endDate"); //$NON-NLS-1$
if (toDate != null) {
try {
this.endDate = DATE_FORMAT.parse(toD).getTime();
this.endDate = DATE_FORMAT.parse(toDate).getTime();
} catch (ParseException e) {
log.error("Error parse To Date '" + toD + "'.", e);
log.error("Error parse End Date '" + toDate + "'.", e);
}
}
......
/*
* 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.generator;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSAttributeBase;
import org.jkiss.dbeaver.model.struct.DBSDataManipulator;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
public class DateSequenceGenerator extends AbstractMockValueGenerator {
private static final Log log = Log.getLog(DateSequenceGenerator.class);
private static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd-MM-yyyy"); //$NON-NLS-1$
public static final long DAY_RANGE = 24 * 60 * 60 * 1000; // 1 day
private long startDate = Long.MAX_VALUE;
private boolean reverse = false;
private long step = DAY_RANGE; // in ms
@Override
public void init(DBSDataManipulator container, DBSAttributeBase attribute, Map<Object, Object> properties) throws DBException {
super.init(container, attribute, properties);
String fromDate = (String) properties.get("startDate"); //$NON-NLS-1$
if (fromDate != null) {
try {
this.startDate = DATE_FORMAT.parse(fromDate).getTime();
} catch (ParseException e) {
log.error("Error parse Start Date '" + fromDate + "'.", e);
}
}
// default is today
if (startDate == Long.MAX_VALUE) {
startDate = new Date().getTime();
}
Integer step = (Integer) properties.get("step"); //$NON-NLS-1$
if (step != null) {
this.step = step * DAY_RANGE;
}
Boolean reverse = (Boolean) properties.get("reverse"); //$NON-NLS-1$
if (reverse != null) {
this.reverse = reverse;
}
}
@Override
public Object generateOneValue(DBRProgressMonitor monitor) throws DBException {
if (isGenerateNULL()) {
return null;
} else {
long value = this.startDate;
if (reverse) {
startDate -= step;
} else {
startDate += step;
}
return new Date(value);
}
}
}
......@@ -32,6 +32,8 @@ import java.util.Map;
public class StringTextGenerator extends AbstractMockValueGenerator {
private String templateString;
private int minLength = 1;
private int maxLength = 0;
@Override
public void init(DBSDataManipulator container, DBSAttributeBase attribute, Map<Object, Object> properties) throws DBException {
......@@ -41,6 +43,23 @@ public class StringTextGenerator extends AbstractMockValueGenerator {
if (templateString == null) {
throw new DBCException("Empty template string for simple string generator");
}
Integer min = (Integer) properties.get("minLength"); //$NON-NLS-1$
if (min != null) {
this.minLength = min;
}
Integer max = (Integer) properties.get("maxLength"); //$NON-NLS-1$
if (max != null) {
this.maxLength = max;
}
if (maxLength == 0 || maxLength > attribute.getMaxLength()) {
maxLength = (int) attribute.getMaxLength();
}
if (maxLength > templateString.length()) {
maxLength = templateString.length();
}
}
@Override
......@@ -53,7 +72,7 @@ public class StringTextGenerator extends AbstractMockValueGenerator {
if (isGenerateNULL()) {
return null;
} else {
int length = (int) Math.min(10000, attribute.getMaxLength());
int length = minLength + random.nextInt(maxLength - minLength + 1);
int tplLength = templateString.length();
int start = random.nextInt(tplLength);
if (start + length < tplLength) {
......
......@@ -16,17 +16,18 @@
*/
package org.jkiss.dbeaver.model.impl;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IConfigurationElement;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor;
import org.jkiss.dbeaver.model.meta.IPropertyValueListProvider;
import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor;
import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.utils.CommonUtils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
......@@ -34,6 +35,9 @@ import java.util.List;
*/
public class PropertyDescriptor implements DBPPropertyDescriptor, IPropertyValueListProvider<Object>
{
public static final String CURRENT_DATE_STRING_VAR_PREFIX = "${now as ";
public enum PropertyType
{
t_string(String.class),
......@@ -120,18 +124,28 @@ public class PropertyDescriptor implements DBPPropertyDescriptor, IPropertyValue
type = String.class;
}
}
this.defaultValue = GeneralUtils.convertString(config.getAttribute(ATTR_DEFAULT_VALUE), type);
this.defaultValue = convertString(config.getAttribute(ATTR_DEFAULT_VALUE), type);
String valueList = config.getAttribute(ATTR_VALID_VALUES);
if (valueList != null) {
final String[] values = valueList.split(VALUE_SPLITTER);
validValues = new Object[values.length];
for (int i = 0, valuesLength = values.length; i < valuesLength; i++) {
validValues[i] = GeneralUtils.convertString(values[i], type);
validValues[i] = convertString(values[i], type);
}
}
this.editable = true;
}
public static Object convertString(String value, Class<?> valueType)
{
if (!CommonUtils.isEmpty(value) && valueType == String.class && value.startsWith(CURRENT_DATE_STRING_VAR_PREFIX)) {
String pattern = value.substring(9, value.length() - 1);
return new SimpleDateFormat(pattern).format(new Date());
} else {
return GeneralUtils.convertString(value, valueType);
}
}
public PropertyDescriptor(String category, Object id, String name, String description, Class<?> type, boolean required, String defaultValue, String[] validValues, boolean editable) {
this.category = category;
this.id = id;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册