/*
* 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();
}
}
}
}
}