Skip to content

Commit

Permalink
TEIIDDES-2209
Browse files Browse the repository at this point in the history
 * DDL Import provides option to generate default valid SQL
 * New Model Wizard - Copy Model as Virtual model option provides option to generate default SQL
 * Required adding pass-through properties to TransformationNewModelObjectHelper.helpCreate() method so it could generate, apply, reconcile and validate the SQL.
  • Loading branch information
blafond committed Jul 1, 2014
1 parent 40153af commit d44e4f4
Show file tree
Hide file tree
Showing 10 changed files with 204 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
Expand Down Expand Up @@ -55,7 +56,7 @@
import org.teiid.core.designer.exception.EmptyArgumentException;
import org.teiid.core.designer.util.CoreStringUtil;
import org.teiid.core.designer.util.FileUtil;
import org.teiid.core.designer.util.StringUtilities;
import org.teiid.core.designer.util.StringConstants;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.validation.rules.StringNameValidator;
import org.teiid.designer.core.workspace.ModelResource;
Expand Down Expand Up @@ -98,9 +99,10 @@ class DdlImporterPage extends WizardPage implements IPersistentWizardPage {
private Combo ddlFileCombo;
private Text modelFolderFld;
private Text modelNameFld;
private Combo dialectCombo;
Combo dialectCombo;
private Button autoSelectDialectCheckBox;
private Combo modelTypeCombo;
private Button generateDefaultSQLCheckBox;
private Button optToSetModelEntityDescriptionCheckBox;
private Button optToCreateModelEntitiesForUnsupportedDdlCheckBox;
private ExpandBar ddlFileContentsExpanderBar;
Expand Down Expand Up @@ -263,18 +265,19 @@ public void createControl( final Composite parent ) {
final Composite panel = WidgetFactory.createPanel(parent, SWT.NONE, GridData.FILL_BOTH, 1, PANEL_GRID_SPAN);
setControl(panel);

Composite ddlFileGroup = WidgetFactory.createGroup(panel, DdlImporterUiI18n.FILE_GROUP_LABEL, GridData.FILL_HORIZONTAL, 3, 3);
// ----------------------------------------
// DDL File controls
// ----------------------------------------
WidgetFactory.createLabel(panel, GridData.VERTICAL_ALIGN_CENTER, DdlImporterUiI18n.DDL_FILE_LABEL);
WidgetFactory.createLabel(ddlFileGroup, GridData.VERTICAL_ALIGN_CENTER, DdlImporterUiI18n.DDL_FILE_LABEL);
String[] ddlFileHistory = settings.getArray(HISTORY_SETTING);
List<String> historyList = null;
if(ddlFileHistory!=null) {
historyList = Arrays.asList(ddlFileHistory);
} else {
historyList = Collections.emptyList();
}
ddlFileCombo = WidgetFactory.createCombo(panel, SWT.NONE, GridData.FILL_HORIZONTAL, historyList, new LabelProvider(), false) ;
ddlFileCombo = WidgetFactory.createCombo(ddlFileGroup, SWT.NONE, GridData.FILL_HORIZONTAL, historyList, new LabelProvider(), false) ;
ddlFileCombo.addModifyListener(new ModifyListener() {

@Override
Expand All @@ -289,7 +292,7 @@ public void widgetSelected( final SelectionEvent event ) {
ddlFileSelected();
}
});
final Composite buttonPanel = WidgetFactory.createPanel(panel, SWT.NO_TRIM);
final Composite buttonPanel = WidgetFactory.createPanel(ddlFileGroup, SWT.NO_TRIM);
Button button = WidgetFactory.createButton(buttonPanel,
DdlImporterUiI18n.CHOOSE_FROM_FILE_SYSTEM_BUTTON,
GridData.HORIZONTAL_ALIGN_FILL);
Expand All @@ -314,8 +317,8 @@ public void widgetSelected( final SelectionEvent event ) {
// ----------------------------------------
// DDL Dialect controls
// ----------------------------------------
WidgetFactory.createLabel(panel, GridData.VERTICAL_ALIGN_CENTER, DdlImporterUiI18n.DIALECT_LABEL);
final Composite dialectPanel = WidgetFactory.createPanel(panel, SWT.NONE, GridData.HORIZONTAL_ALIGN_FILL, 2, 2);
WidgetFactory.createLabel(ddlFileGroup, GridData.VERTICAL_ALIGN_CENTER, DdlImporterUiI18n.DIALECT_LABEL);
final Composite dialectPanel = WidgetFactory.createPanel(ddlFileGroup, SWT.NONE, GridData.HORIZONTAL_ALIGN_FILL, 2, 2);
dialectCombo = WidgetFactory.createCombo(dialectPanel, SWT.READ_ONLY, GridData.HORIZONTAL_ALIGN_FILL, DIALECT_TYPES, new LabelProvider(), false);
dialectCombo.addSelectionListener(new SelectionAdapter() {

Expand Down Expand Up @@ -347,11 +350,13 @@ public void widgetSelected( final SelectionEvent event ) {
// Disable Combo initially - auto-select is checked
dialectCombo.setEnabled(false);


Composite modelInfoGroup = WidgetFactory.createGroup(panel, DdlImporterUiI18n.MODEL_GROUP_LABEL, GridData.FILL_HORIZONTAL, 3, 3);
// ----------------------------------------
// Model Folder controls
// ----------------------------------------
WidgetFactory.createLabel(panel, GridData.VERTICAL_ALIGN_CENTER, DdlImporterUiI18n.MODEL_FOLDER_LABEL);
modelFolderFld = WidgetFactory.createTextField(panel);
WidgetFactory.createLabel(modelInfoGroup, GridData.VERTICAL_ALIGN_CENTER, DdlImporterUiI18n.MODEL_FOLDER_LABEL);
modelFolderFld = WidgetFactory.createTextField(modelInfoGroup, GridData.FILL_HORIZONTAL);
final IContainer modelFolder = importer.modelFolder();
if (modelFolder != null) modelFolderFld.setText(modelFolder.getFullPath().toString());
modelFolderFld.addModifyListener(new ModifyListener() {
Expand All @@ -361,7 +366,7 @@ public void modifyText( final ModifyEvent event ) {
validate();
}
});
button = WidgetFactory.createButton(panel, DdlImporterUiI18n.CHOOSE_BUTTON);
button = WidgetFactory.createButton(modelInfoGroup, DdlImporterUiI18n.CHOOSE_BUTTON);
if (projects.length == 0) button.setEnabled(false);
else button.addSelectionListener(new SelectionAdapter() {

Expand All @@ -374,16 +379,16 @@ public void widgetSelected( final SelectionEvent event ) {
// ----------------------------------------
// Model Name controls
// ----------------------------------------
WidgetFactory.createLabel(panel, GridData.VERTICAL_ALIGN_CENTER, DdlImporterUiI18n.MODEL_NAME_LABEL);
modelNameFld = WidgetFactory.createTextField(panel);
WidgetFactory.createLabel(modelInfoGroup, GridData.VERTICAL_ALIGN_CENTER, DdlImporterUiI18n.MODEL_NAME_LABEL);
modelNameFld = WidgetFactory.createTextField(modelInfoGroup);
modelNameFld.addModifyListener(new ModifyListener() {

@Override
public void modifyText( final ModifyEvent event ) {
modelNameModified();
}
});
button = WidgetFactory.createButton(panel, DdlImporterUiI18n.CHOOSE_BUTTON);
button = WidgetFactory.createButton(modelInfoGroup, DdlImporterUiI18n.CHOOSE_BUTTON);
if (projects.length == 0) button.setEnabled(false);
else button.addSelectionListener(new SelectionAdapter() {

Expand All @@ -396,8 +401,9 @@ public void widgetSelected( final SelectionEvent event ) {
// ----------------------------------------
// Model Type controls
// ----------------------------------------
WidgetFactory.createLabel(panel, GridData.VERTICAL_ALIGN_CENTER, DdlImporterUiI18n.MODEL_TYPE_LABEL);
modelTypeCombo = WidgetFactory.createCombo(panel, SWT.READ_ONLY, 0, PANEL_GRID_SPAN - 1, MODEL_TYPES, new LabelProvider() {
WidgetFactory.createLabel(modelInfoGroup, GridData.VERTICAL_ALIGN_CENTER, DdlImporterUiI18n.MODEL_TYPE_LABEL);
final Composite modelTypePanel = WidgetFactory.createPanel(modelInfoGroup, SWT.NONE, GridData.HORIZONTAL_ALIGN_FILL, 2, 2);
modelTypeCombo = WidgetFactory.createCombo(modelTypePanel, SWT.READ_ONLY, GridData.HORIZONTAL_ALIGN_FILL, MODEL_TYPES, new LabelProvider() {

@Override
public String getText( final Object element ) {
Expand All @@ -418,12 +424,27 @@ public void widgetSelected( final SelectionEvent event ) {
validate();
}
});
// 'Auto-select' checkbox is checked initially
generateDefaultSQLCheckBox = WidgetFactory.createCheckBox(modelTypePanel,
DdlImporterUiI18n.GENERATE_DEFAULT_SQL_CHECKBOX,
0,
1,
false);
generateDefaultSQLCheckBox.addSelectionListener(new SelectionAdapter() {

@Override
public void widgetSelected( final SelectionEvent event ) {
generateDefaultSQLChanged();
}
});
generateDefaultSQLCheckBox.setEnabled(false);
modelTypeCombo.select(modelTypeCombo.indexOf(ModelType.PHYSICAL_LITERAL.getDisplayName()));

Composite optionsGroup = WidgetFactory.createGroup(panel, DdlImporterUiI18n.OPTIONS_GROUP_LABEL, GridData.FILL_HORIZONTAL, 3, 1);
// ----------------------------------------
// Option checkboxes
// ----------------------------------------
optToSetModelEntityDescriptionCheckBox = WidgetFactory.createCheckBox(panel,
optToSetModelEntityDescriptionCheckBox = WidgetFactory.createCheckBox(optionsGroup,
DdlImporterUiI18n.OPT_TO_SET_MODEL_ENTITY_DESCRIPTION_LABEL,
0,
PANEL_GRID_SPAN,
Expand All @@ -439,7 +460,7 @@ public void widgetSelected( final SelectionEvent event ) {
// make sure importer has restored setting
optToSetModelEntityDescriptionModified();

optToCreateModelEntitiesForUnsupportedDdlCheckBox = WidgetFactory.createCheckBox(panel,
optToCreateModelEntitiesForUnsupportedDdlCheckBox = WidgetFactory.createCheckBox(optionsGroup,
DdlImporterUiI18n.OPT_TO_CREATE_MODEL_ENTITIES_FOR_UNSUPPORTED_DDL_LABEL,
0,
PANEL_GRID_SPAN,
Expand Down Expand Up @@ -502,10 +523,10 @@ void ddlFileModified() {
final String ddlFileName = importer.ddlFileName();
if (ddlFileName == null) {
if (generateModelName) {
modelNameFld.setText(StringUtilities.EMPTY_STRING);
modelNameFld.setText(StringConstants.EMPTY_STRING);
generateModelName = true;
}
ddlFileContentsBox.setText(StringUtilities.EMPTY_STRING);
ddlFileContentsBox.setText(StringConstants.EMPTY_STRING);
} else {
if (generateModelName) {
modelNameFld.setText(Path.fromOSString(ddlFileName).removeFileExtension().lastSegment());
Expand Down Expand Up @@ -533,6 +554,11 @@ void modelNameModified() {

void modelTypeModified() {
importer.setModelType(MODEL_TYPES.get(modelTypeCombo.indexOf(modelTypeCombo.getText())));
if( modelTypeCombo.getText().equals(ModelType.VIRTUAL_LITERAL.getDisplayName())) {
this.generateDefaultSQLCheckBox.setEnabled(true);
} else {
this.generateDefaultSQLCheckBox.setEnabled(false);
}
}

void selectDialect(String dialect) {
Expand All @@ -559,6 +585,10 @@ void autoSelectDialectChanged( ) {
}
}
}

void generateDefaultSQLChanged() {
importer.setGenerateDefaultSQL(this.generateDefaultSQLCheckBox.getSelection());
}

void optToCreateModelEntitiesForUnsupportedDdlModified() {
importer.setOptToCreateModelEntitiesForUnsupportedDdl(optToCreateModelEntitiesForUnsupportedDdlCheckBox.getSelection());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@
import static org.teiid.designer.ddl.importer.ui.DdlImporterUiPlugin.i18n;

class DdlImporterUiI18n {
static final String FILE_GROUP_LABEL = i18n("fileGroupLabel"); //$NON-NLS-1$
static final String CHOOSE_BUTTON = i18n("chooseButton"); //$NON-NLS-1$
static final String CHOOSE_DDL_FILE_DIALOG_MSG = i18n("chooseDdlFileDialogMsg"); //$NON-NLS-1$
static final String CHOOSE_DDL_FILE_DIALOG_TITLE = i18n("chooseDdlFileDialogTitle"); //$NON-NLS-1$
static final String CHOOSE_FROM_FILE_SYSTEM_BUTTON = i18n("chooseFromFileSystemButton"); //$NON-NLS-1$
static final String CHOOSE_FROM_WORKSPACE_BUTTON = i18n("chooseFromWorkspaceButton"); //$NON-NLS-1$
static final String DIALECT_LABEL = i18n("dialectLabel"); //$NON-NLS-1$
static final String AUTO_SELECT_DIALECT_CHECKBOX = i18n("autoSelectDialectCheckBox"); //$NON-NLS-1$
static final String GENERATE_DEFAULT_SQL_CHECKBOX = i18n("generateDefaultSQLCheckBox"); //$NON-NLS-1$
static final String CHOOSE_MODEL_FOLDER_DIALOG_MSG = i18n("chooseModelFolderDialogMsg"); //$NON-NLS-1$
static final String CHOOSE_MODEL_FOLDER_DIALOG_TITLE = i18n("chooseModelFolderDialogTitle"); //$NON-NLS-1$
static final String CHOOSE_MODEL_FILE_DIALOG_MSG = i18n("chooseModelFileDialogMsg"); //$NON-NLS-1$
Expand Down Expand Up @@ -44,6 +46,8 @@ class DdlImporterUiI18n {
static final String WIZARD_TITLE = i18n("wizardTitle"); //$NON-NLS-1$
static final String IMPORT_COMPLETED_WITH_WARNINGS_TITLE = i18n("importCompletedWithWarningsTitle"); //$NON-NLS-1$
static final String IMPORT_COMPLETED_WITH_WARNINGS_MESSAGE = i18n("importCompletedWithWarningsMessage"); //$NON-NLS-1$
static final String MODEL_GROUP_LABEL = i18n("modelGroupLabel"); //$NON-NLS-1$
static final String OPTIONS_GROUP_LABEL = i18n("optionsGroupLabel"); //$NON-NLS-1$

static final String DIFFERENCE_PAGE_TITLE = i18n("differencePage.title"); //$NON-NLS-1$
static final String DIFFERENCE_PAGE_DESCRIPTION = i18n("differencePage.description"); //$NON-NLS-1$
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
fileGroupLabel=DDL File Definition
chooseButton = Choose...
chooseDdlFileDialogMsg = Choose a workspace DDL file to import into a relational model.
chooseDdlFileDialogTitle = Workspace DDL Files
chooseFromFileSystemButton = Choose from file system...
chooseFromWorkspaceButton = Choose from workspace...
dialectLabel = DDL Dialect:
dialectLabel = Dialect:
autoSelectDialectCheckBox = Auto-select
generateDefaultSQLCheckBox = Generate valid default SQL (SELECT null AS column_name, etc....)
chooseModelFolderDialogMsg = Choose a workspace folder where the model should be created or updated.
chooseModelFolderDialogTitle = Workspace Folders
chooseModelFileDialogMsg = Choose a workspace model to be updated.
Expand All @@ -14,7 +16,7 @@ continueImportMsg = The following errors were encountered. Continue with import
createMsgPart = Create
createMsgSuffix = \ "{0}" will also be created.
ddlFileContentsTitle = DDL file contents
ddlFileLabel = DDL file:\
ddlFileLabel = File:\
ddlFileMsg = Provide a valid path to the DDL file to import.
importingDdlMsg = Importing DDL...
modelFolderLabel = Model folder:\
Expand All @@ -32,6 +34,8 @@ updateMsgPart = Update
wizardTitle = Import DDL
importCompletedWithWarningsTitle = DDL Import Warnings
importCompletedWithWarningsMessage = The relational model was created, but with importer warnings. Consult the list below to determine if re-import is required.
modelGroupLabel=Model Definition
optionsGroupLabel=Options

differencePage.title = Select the Differences to Apply
differencePage.description = Select the items to apply, then click 'Finish'.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@

import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Properties;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
Expand All @@ -21,25 +25,31 @@
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.ecore.EObject;
import org.modeshape.common.text.ParsingException;
import org.modeshape.common.text.Position;
import org.modeshape.sequencer.ddl.DdlParsers;
import org.modeshape.sequencer.ddl.StandardDdlLexicon;
import org.modeshape.sequencer.ddl.node.AstNode;
import org.teiid.core.designer.ModelerCoreException;
import org.teiid.core.designer.exception.EmptyArgumentException;
import org.teiid.core.designer.util.CoreStringUtil;
import org.teiid.core.designer.util.FileUtils;
import org.teiid.core.designer.util.OperationUtil;
import org.teiid.core.designer.util.OperationUtil.Unreliable;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.util.NewModelObjectHelperManager;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.core.workspace.ModelUtil;
import org.teiid.designer.ddl.DdlImporterManager;
import org.teiid.designer.ddl.DdlNodeImporter;
import org.teiid.designer.ddl.registry.DdlNodeImporterRegistry;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.core.ModelType;
import org.teiid.designer.metamodels.relational.BaseTable;
import org.teiid.designer.metamodels.relational.Procedure;
import org.teiid.designer.metamodels.relational.RelationalPackage;
import org.teiid.designer.metamodels.relational.View;
import org.teiid.designer.relational.compare.DifferenceGenerator;
import org.teiid.designer.relational.compare.DifferenceReport;
import org.teiid.designer.relational.model.RelationalModel;
Expand All @@ -62,6 +72,7 @@ public class DdlImporter {
private ModelResource model;
private String ddlString;
private IStatus importStatus;
private boolean generateDefaultSQL;

private DdlImporterManager importManager = new DdlImporterManager();

Expand Down Expand Up @@ -289,6 +300,29 @@ public void save(IProgressMonitor monitor, int totalWork ) throws Exception {
// Update the model, based on difference report
importStatus = EmfModelGenerator.INSTANCE.execute(diffReport, model, monitor, totalWork);

// If Virtual Model, then find all created Tables, Procedures and Views and call help create to get the transformations set correctly
if(importManager.getModelType() == ModelType.VIRTUAL_LITERAL ) {
Properties props = new Properties();
if( doGenerateDefaultSQL() ) {
props.put("generateDefaultSQL", generateDefaultSQL); //$NON-NLS-1$
props.put("validate", generateDefaultSQL); //$NON-NLS-1$
}

Collection<EObject> targets = new ArrayList<EObject>();

for( Object nextObj : model.getEObjects() ) {
if( nextObj instanceof Procedure || nextObj instanceof BaseTable || nextObj instanceof View) {
try {
NewModelObjectHelperManager.helpCreate(nextObj, props);
targets.add((EObject)nextObj);
} catch (ModelerCoreException err) {
DdlImporterPlugin.UTIL.log(IStatus.ERROR, err, err.getMessage());
}
}
}
}


// Save model
model.save(monitor, false);

Expand Down Expand Up @@ -408,6 +442,20 @@ public void setOptToCreateModelEntitiesForUnsupportedDdl(boolean optToCreateMode
public void setOptToSetModelEntityDescription(boolean optToSetModelEntityDescription ) {
importManager.setOptToSetModelEntityDescription(optToSetModelEntityDescription);
}

/**
* @param value
*/
public void setGenerateDefaultSQL(boolean value) {
this.generateDefaultSQL = value;
}

/**
* @return generateDefaultSQL
*/
public boolean doGenerateDefaultSQL() {
return this.generateDefaultSQL;
}

/**
* @return the specifiedParser
Expand Down

0 comments on commit d44e4f4

Please sign in to comment.