/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.relational.ui.actions; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.core.workspace.ModelWorkspaceException; import org.teiid.designer.metamodels.relational.Index; import org.teiid.designer.metamodels.relational.Procedure; import org.teiid.designer.metamodels.relational.Table; import org.teiid.designer.relational.model.RelationalModel; import org.teiid.designer.relational.model.RelationalModelFactory; import org.teiid.designer.relational.model.RelationalTable; import org.teiid.designer.relational.ui.Messages; import org.teiid.designer.relational.ui.UiConstants; import org.teiid.designer.relational.ui.UiPlugin; import org.teiid.designer.relational.ui.edit.RelationalDialogModel; import org.teiid.designer.relational.ui.editor.EditRelationalObjectDialog; import org.teiid.designer.type.IDataTypeManagerService; import org.teiid.designer.ui.actions.INewChildAction; import org.teiid.designer.ui.actions.INewSiblingAction; import org.teiid.designer.ui.common.eventsupport.SelectionUtilities; import org.teiid.designer.ui.editors.ModelEditor; import org.teiid.designer.ui.editors.ModelEditorManager; import org.teiid.designer.ui.viewsupport.ModelIdentifier; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * @since 8.0 */ public class CreateRelationalTableAction extends Action implements INewChildAction, INewSiblingAction { private IFile selectedModel; /** * */ public static final String TITLE = Messages.baseTableActionText; private Collection<String> datatypes; /** * */ public CreateRelationalTableAction() { super(TITLE); setImageDescriptor(UiPlugin.getDefault().getImageDescriptor( UiConstants.Images.NEW_TABLE_ICON)); IDataTypeManagerService service = ModelerCore.getTeiidDataTypeManagerService(); Set<String> unsortedDatatypes = service.getAllDataTypeNames(); datatypes = new ArrayList<String>(); String[] sortedStrings = unsortedDatatypes.toArray(new String[unsortedDatatypes.size()]); Arrays.sort(sortedStrings); for( String dType : sortedStrings ) { datatypes.add(dType); } } /* (non-Javadoc) * @See org.teiid.designer.ui.actions.INewChildAction#canCreateChild(org.eclipse.emf.ecore.EObject) */ @Override public boolean canCreateChild(EObject parent) { return false; } /* (non-Javadoc) * @See org.teiid.designer.ui.actions.INewChildAction#canCreateChild(org.eclipse.core.resources.IFile) */ @Override public boolean canCreateChild(IFile modelFile) { return isApplicable(new StructuredSelection(modelFile)); } /* (non-Javadoc) * @See org.teiid.designer.ui.actions.INewSiblingAction#canCreateChild(org.eclipse.emf.ecore.EObject) */ @Override public boolean canCreateSibling(EObject parent) { // has to be a table, view, procedure or function if( !(parent instanceof Table || parent instanceof Procedure || parent instanceof Index) ) { return false; } //Convert eObject selection to IFile ModelResource mr = ModelUtilities.getModelResourceForModelObject(parent); if( mr != null ) { IFile modelFile = null; try { modelFile = (IFile)mr.getCorrespondingResource(); } catch (ModelWorkspaceException ex) { UiConstants.Util.log(ex); } if( modelFile != null ) { return isApplicable(new StructuredSelection(modelFile)); } } return false; } /** * @param selection the current selection * @return true if applicable to the selection, else false */ public boolean isApplicable(ISelection selection) { boolean result = false; if (!SelectionUtilities.isMultiSelection(selection)) { Object obj = SelectionUtilities.getSelectedObject(selection); if (obj instanceof IResource) { IResource iRes = (IResource) obj; if (ModelIdentifier.isRelationalSourceModel(iRes) || ModelIdentifier.isRelationshipModel(iRes)) { this.selectedModel = (IFile) obj; result = true; } } } return result; } @Override public void run() { if( selectedModel != null ) { ModelResource mr = ModelUtilities.getModelResource(selectedModel); final Shell shell = UiPlugin.getDefault().getCurrentWorkbenchWindow().getShell(); RelationalTable table = new RelationalTable(); table.setSupportsUpdate(true); // Hand the table off to the generic edit dialog RelationalDialogModel dialogModel = new RelationalDialogModel(table, selectedModel); EditRelationalObjectDialog dialog = new EditRelationalObjectDialog(shell, dialogModel); dialog.open(); if (dialog.getReturnCode() == Window.OK) { createTableInTxn(mr, table); } } } private void createTableInTxn(ModelResource modelResource, RelationalTable table) { boolean requiredStart = ModelerCore.startTxn(true, true, Messages.createRelationalTableTitle, this); boolean succeeded = false; try { ModelEditor editor = ModelEditorManager.getModelEditorForFile((IFile)modelResource.getCorrespondingResource(), true); if (editor != null) { boolean isDirty = editor.isDirty(); RelationalModelFactory factory = new RelationalModelFactory(); RelationalModel relModel = new RelationalModel("dummy"); //$NON-NLS-1$ relModel.addChild(table); factory.build(modelResource, relModel, new NullProgressMonitor()); //factory.buildObject(table, modelResource, new NullProgressMonitor()); if (!isDirty && editor.isDirty()) { editor.doSave(new NullProgressMonitor()); } succeeded = true; } } catch (Exception e) { MessageDialog.openError(Display.getCurrent().getActiveShell(), Messages.createRelationalTableExceptionMessage, e.getMessage()); IStatus status = new Status(IStatus.ERROR, UiConstants.PLUGIN_ID, Messages.createRelationalTableExceptionMessage, e); UiConstants.Util.log(status); return; } finally { // if we started the txn, commit it. if (requiredStart) { if (succeeded) { ModelerCore.commitTxn(); } else { ModelerCore.rollbackTxn(); } } } } }