/*
* 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.transformation.ui.actions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Properties;
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.relational.model.RelationalModel;
import org.teiid.designer.relational.model.RelationalViewTable;
import org.teiid.designer.relational.ui.UiConstants;
import org.teiid.designer.relational.ui.UiPlugin;
import org.teiid.designer.relational.ui.editor.EditRelationalObjectDialog;
import org.teiid.designer.transformation.model.RelationalViewModelFactory;
import org.teiid.designer.transformation.ui.Messages;
import org.teiid.designer.transformation.ui.editors.TransformationDialogModel;
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.DesignerPropertiesUtil;
import org.teiid.designer.ui.viewsupport.ModelIdentifier;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* @since 8.0
*/
public class CreateViewTableAction extends Action implements INewChildAction, INewSiblingAction {
private IFile selectedModel;
/**
*
*/
public static final String TITLE = Messages.createRelationalViewTableActionText;
private Collection<String> datatypes;
private Properties designerProperties;
private EObject newViewTable;
private RelationalViewTable relationalViewTable;
/**
*
*/
public CreateViewTableAction() {
super(TITLE);
setImageDescriptor(UiPlugin.getDefault().getImageDescriptor( UiConstants.Images.NEW_VIRTUAL_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);
}
}
/**
* @param properties the initial designer properties
*/
public CreateViewTableAction( Properties properties ) {
this();
this.designerProperties = properties;
}
/* (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.INewChildAc
tion#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) {
//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 selection
* @return if selection is applicable for this action
*/
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.isRelationalViewModel(iRes)) {
this.selectedModel = (IFile) obj;
result = true;
}
}
}
return result;
}
@Override
public void run() {
// If properties were passed in, use it's model as the selection - if available
if (this.designerProperties != null) {
IFile propsViewModel = DesignerPropertiesUtil.getViewModel(this.designerProperties);
if (propsViewModel != null) this.selectedModel = propsViewModel;
}
if( selectedModel != null ) {
ModelResource mr = ModelUtilities.getModelResource(selectedModel);
final Shell shell = UiPlugin.getDefault().getCurrentWorkbenchWindow().getShell();
relationalViewTable = new RelationalViewTable();
relationalViewTable.setSupportsUpdate(true);
// Hand the table off to the generic edit dialog
TransformationDialogModel dialogModel = new TransformationDialogModel(relationalViewTable, selectedModel);
EditRelationalObjectDialog dialog = new EditRelationalObjectDialog(shell, dialogModel);
dialog.open();
if (dialog.getReturnCode() == Window.OK) {
this.newViewTable = createViewTableInTxn(mr, relationalViewTable);
} else {
this.relationalViewTable = null;
this.newViewTable = null;
}
}
}
private EObject createViewTableInTxn( ModelResource modelResource, RelationalViewTable viewTable ) {
EObject newTable = null;
boolean requiredStart = ModelerCore.startTxn(true, true, Messages.createRelationalViewTableTitle, this);
boolean succeeded = false;
try {
ModelEditor editor = ModelEditorManager.getModelEditorForFile((IFile)modelResource.getCorrespondingResource(), true);
if (editor != null) {
boolean isDirty = editor.isDirty();
RelationalViewModelFactory factory = new RelationalViewModelFactory();
RelationalModel relModel = new RelationalModel("dummy"); //$NON-NLS-1$
relModel.addChild(viewTable);
factory.build(modelResource, relModel, new NullProgressMonitor());
//factory.buildObject(table, modelResource, new NullProgressMonitor());
if (!isDirty && editor.isDirty()) {
editor.doSave(new NullProgressMonitor());
}
succeeded = true;
for( Object child : modelResource.getEObjects() ) {
EObject eObj = (EObject)child;
if( ModelerCore.getModelEditor().getName(eObj).equalsIgnoreCase(this.relationalViewTable.getName()) ) {
newTable = eObj;
break;
}
}
}
} catch (Exception e) {
MessageDialog.openError(Display.getCurrent().getActiveShell(),
Messages.createRelationalViewTableExceptionMessage,
e.getMessage());
IStatus status = new Status(IStatus.ERROR, UiConstants.PLUGIN_ID, Messages.createRelationalViewTableExceptionMessage, e);
UiConstants.Util.log(status);
return null;
} finally {
// if we started the txn, commit it.
if (requiredStart) {
if (succeeded) {
ModelerCore.commitTxn();
} else {
ModelerCore.rollbackTxn();
}
}
}
return newTable;
}
/**
* @return the new view table EObject
*/
public EObject getNewViewTable() {
return this.newViewTable;
}
}