/* * 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 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.RelationalIndex; import org.teiid.designer.relational.model.RelationalModel; import org.teiid.designer.relational.model.RelationalModelFactory; 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.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; /** * */ public class CreateRelationalIndexAction extends Action implements INewChildAction, INewSiblingAction { private IFile selectedModel; /** * */ public static final String TITLE = Messages.createRelationalIndexActionText; /** * */ public CreateRelationalIndexAction() { super(TITLE); setImageDescriptor(UiPlugin.getDefault().getImageDescriptor( UiConstants.Images.NEW_INDEX_ICON)); } /* (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 selection * @return true if selection applicable */ 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)) { 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(); RelationalIndex index = new RelationalIndex(); // Hand the table off to the generic edit dialog RelationalDialogModel dialogModel = new RelationalDialogModel(index, selectedModel); EditRelationalObjectDialog dialog = new EditRelationalObjectDialog(shell, dialogModel); dialog.open(); if (dialog.getReturnCode() == Window.OK) { createIndexInTxn(mr, index); } } } private void createIndexInTxn(ModelResource modelResource, RelationalIndex index) { boolean requiredStart = ModelerCore.startTxn(true, true, Messages.createRelationalProcedureTitle, 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(index); factory.build(modelResource, relModel, new NullProgressMonitor()); if (!isDirty && editor.isDirty()) { editor.doSave(new NullProgressMonitor()); } succeeded = true; } } catch (Exception e) { MessageDialog.openError(Display.getCurrent().getActiveShell(), Messages.createRelationalIndexExceptionMessage, e.getMessage()); IStatus status = new Status(IStatus.ERROR, UiConstants.PLUGIN_ID, Messages.createRelationalIndexExceptionMessage, e); UiConstants.Util.log(status); return; } finally { // if we started the txn, commit it. if (requiredStart) { if (succeeded) { ModelerCore.commitTxn(); } else { ModelerCore.rollbackTxn(); } } } } }