diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/UIUtils.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/UIUtils.java index 9f98c36c172ea7d6f02e303f7be50f989b4acf78..6f36dfccb2690593dfd9bc6f815d64c3fc2e1eb7 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/UIUtils.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/UIUtils.java @@ -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) { diff --git a/plugins/org.jkiss.dbeaver.ext.mockdata/plugin.xml b/plugins/org.jkiss.dbeaver.ext.mockdata/plugin.xml index 54d9734084e2ae25917742e61a090234fa83c7f0..b66e3fcd433b26816f7ac5cc1e51591b4f1d0c0c 100644 --- a/plugins/org.jkiss.dbeaver.ext.mockdata/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.mockdata/plugin.xml @@ -42,6 +42,8 @@ + + @@ -102,6 +104,22 @@ + + + + + + + + + + + + attributes; + private boolean removeOldData; - private long rowsNumber = 10; + private long rowsNumber = 1000; + private Map generatorDescriptors = new HashMap<>(); // generatorId -> MockGeneratorDescriptor private Map attributeGenerators = new HashMap<>(); // attribute.name -> generators properties // populate attribute generators properties map - public Collection init(MockDataExecuteWizard wizard) throws DBException { + public void init(MockDataExecuteWizard wizard) throws DBException { List databaseObjects = wizard.getDatabaseObjects(); DBSDataManipulator dataManipulator = databaseObjects.iterator().next(); // TODO only the first - DBSEntity dbsEntity = (DBSEntity) dataManipulator; + dbsEntity = (DBSEntity) dataManipulator; + attributes = new ArrayList<>(); - final Collection 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 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 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 properties = generatorPropertySource.getPropertiesWithDefaults(); + for (Map.Entry 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 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 properties = generatorPropertySource.getPropertiesWithDefaults(); + for (Map.Entry propEntry : properties.entrySet()) { + UIUtils.putSectionValueWithType(generatorSection, (String) propEntry.getKey(), propEntry.getValue()); + } + } + } + public static class AttributeGeneratorProperties { private final DBSAttributeBase attribute; private String selectedGeneratorId = null; // id diff --git a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/MockDataWizardPageSettings.java b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/MockDataWizardPageSettings.java index 3b12705ac8ff56df4afc36aa1782342630a4e0a6..b816b2d02480ebc45b57cd809184d61741c52acf 100644 --- a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/MockDataWizardPageSettings.java +++ b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/MockDataWizardPageSettings.java @@ -164,18 +164,21 @@ public class MockDataWizardPageSettings extends ActiveWizardPage 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 diff --git a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/DateRandomGenerator.java b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/DateRandomGenerator.java index 08138af8f68b9ccf8a2c9b696de72127cef225f5..3b914d5ecd92fa5708097a9fc570a35e961bdd7c 100644 --- a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/DateRandomGenerator.java +++ b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/DateRandomGenerator.java @@ -46,21 +46,21 @@ public class DateRandomGenerator extends AbstractMockValueGenerator { public void init(DBSDataManipulator container, DBSAttributeBase attribute, Map 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); } } diff --git a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/DateSequenceGenerator.java b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/DateSequenceGenerator.java new file mode 100644 index 0000000000000000000000000000000000000000..6608a27bfbf186f69546f4a779c33c7eea30b75a --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/DateSequenceGenerator.java @@ -0,0 +1,87 @@ +/* + * 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 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); + } + } +} diff --git a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/StringTextGenerator.java b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/StringTextGenerator.java index 2d53168acae0867fa4df67fc0641ff56c1224aed..d4d2df0bff154fb07dc7cefd76e3e058b026ca16 100644 --- a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/StringTextGenerator.java +++ b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/StringTextGenerator.java @@ -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 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) { diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/PropertyDescriptor.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/PropertyDescriptor.java index 4755b96853a1cb25532eb5ea8eb369993ab69f0b..d61103d75a2051e882f402ed502e05b00d8353bf 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/PropertyDescriptor.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/PropertyDescriptor.java @@ -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 { + + 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;