package org.teiid.designer.datatools.ui.actions;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
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.ModelUtil;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
import org.teiid.designer.datatools.connection.ConnectionInfoHelper;
import org.teiid.designer.datatools.ui.DatatoolsUiConstants;
import org.teiid.designer.datatools.ui.DatatoolsUiPlugin;
import org.teiid.designer.ui.actions.IConnectionAction;
import org.teiid.designer.ui.actions.SortableSelectionAction;
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;
/**
* This action allows users to clear/remove all connection profile and translator info from a source model.
*
* This should be and can be run prior to final VDB creation if users wish to keep the Source DB meta-data out of the VDB.
*
* I can also be used to remove this same info prior to exporting a model project set which will be imported/used by
* other users.
*
*
*
* @since 8.0
*/
public class RemoveConnectionInfoAction extends SortableSelectionAction implements IConnectionAction {
private static final String label = DatatoolsUiConstants.UTIL.getString("SetConnectionProfileAction.title"); //$NON-NLS-1$
private ConnectionInfoHelper helper;
/**
* @since 5.0
*/
public RemoveConnectionInfoAction() {
super(label, SWT.DEFAULT);
setImageDescriptor(DatatoolsUiPlugin.getDefault().getImageDescriptor(DatatoolsUiConstants.Images.REMOVE_CONNECTION_ICON));
helper = new ConnectionInfoHelper();
}
/**
* @see org.teiid.designer.ui.actions.SortableSelectionAction#isValidSelection(org.eclipse.jface.viewers.ISelection)
* @since 5.0
*/
@Override
public boolean isValidSelection( ISelection selection ) {
// Enable for single/multiple Virtual Tables
return sourceModelSelected(selection) && hasConnectionInfo(selection);
}
/**
* @see org.eclipse.jface.action.IAction#run()
* @since 5.0
*/
@Override
public void run() {
IFile modelFile = (IFile)SelectionUtilities.getSelectedObjects(getSelection()).get(0);
boolean requiredStart = ModelerCore.startTxn(true, true, "Remove Connection Info", this); //$NON-NLS-1$
boolean succeeded = false;
try {
ModelEditor editor = ModelEditorManager.getModelEditorForFile(modelFile, true);
if (editor != null) {
boolean isDirty = editor.isDirty();
ModelResource modelResource = ModelUtil.getModelResource(modelFile, true);
helper.clearConnectionInfo(modelResource);
if (!isDirty && editor.isDirty()) {
editor.doSave(new NullProgressMonitor());
}
succeeded = true;
}
} catch (Exception e) {
MessageDialog.openError(getShell(),
DatatoolsUiConstants.UTIL.getString("RemoveConnectionInfoAction.exceptionMessage"), e.getMessage()); //$NON-NLS-1$
IStatus status = new Status(IStatus.ERROR, DatatoolsUiConstants.PLUGIN_ID,
DatatoolsUiConstants.UTIL.getString("RemoveConnectionInfoAction.exceptionMessage"), e); //$NON-NLS-1$
DatatoolsUiConstants.UTIL.log(status);
return;
} finally {
// if we started the txn, commit it.
if (requiredStart) {
if (succeeded) {
ModelerCore.commitTxn();
} else {
ModelerCore.rollbackTxn();
}
}
}
}
/**
* @see org.teiid.designer.ui.actions.ISelectionAction#isApplicable(org.eclipse.jface.viewers.ISelection)
* @since 5.0
*/
@Override
public boolean isApplicable( ISelection selection ) {
return sourceModelSelected(selection) && hasConnectionInfo(selection);
}
private boolean sourceModelSelected( ISelection theSelection ) {
boolean result = false;
List<?> allObjs = SelectionUtilities.getSelectedObjects(theSelection);
if (!allObjs.isEmpty() && allObjs.size() == 1) {
Iterator<?> iter = allObjs.iterator();
result = true;
Object nextObj = null;
while (iter.hasNext() && result) {
nextObj = iter.next();
if (nextObj instanceof IFile) {
result = ModelIdentifier.isRelationalSourceModel((IFile)nextObj);
} else {
result = false;
}
}
}
return result;
}
private Shell getShell() {
return Display.getCurrent().getActiveShell();
}
private boolean hasConnectionInfo(ISelection selection) {
try {
ModelResource mr = getSelectedModel(selection);
return helper.hasConnectionInfo(mr);
} catch (ModelWorkspaceException e) {
IStatus status = new Status(IStatus.ERROR, DatatoolsUiConstants.PLUGIN_ID,
DatatoolsUiConstants.UTIL.getString("RemoveConnectionInfoAction.exceptionMessage"), e); //$NON-NLS-1$
DatatoolsUiConstants.UTIL.log(status);
}
return false;
}
private ModelResource getSelectedModel(ISelection selection) throws ModelWorkspaceException {
IFile modelFile = (IFile)SelectionUtilities.getSelectedObjects(selection).get(0);
return ModelUtil.getModelResource(modelFile, true);
}
}