package org.teiid.designer.runtime.ui.connection;
import java.util.ArrayList;
import java.util.Collection;
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.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.datatools.connection.ConnectionInfoHelper;
import org.teiid.designer.runtime.connection.TranslatorUtils;
import org.teiid.designer.runtime.spi.ITeiidServer;
import org.teiid.designer.runtime.spi.ITeiidTranslator;
import org.teiid.designer.runtime.ui.DqpUiConstants;
import org.teiid.designer.runtime.ui.DqpUiPlugin;
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.common.util.WidgetFactory;
import org.teiid.designer.ui.common.widget.Dialog;
import org.teiid.designer.ui.common.widget.Label;
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 SetTranslatorNameAction extends SortableSelectionAction implements IConnectionAction {
private static final String ACTION_TITLE = DqpUiConstants.UTIL.getString("SetTranslatorNameAction.title"); //$NON-NLS-1$
private static final String DIALOG_TITLE = DqpUiConstants.UTIL.getString("EnterTranslatorNameDialog.title"); //$NON-NLS-1$
private static final String SPACE = " "; //$NON-NLS-1$
private ConnectionInfoHelper connectionInfoHelper;
/**
* @since 5.0
*/
public SetTranslatorNameAction() {
super(ACTION_TITLE, SWT.DEFAULT);
setImageDescriptor(DqpUiPlugin.getDefault().getImageDescriptor(DqpUiConstants.Images.SET_CONNECTION_ICON));
this.connectionInfoHelper = 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);
}
/**
* @see org.eclipse.jface.action.IAction#run()
* @since 5.0
*/
@Override
public void run() {
// A) get the selected model and extract a "ConnectionProfileInfo" from it using the ConnectionProfileInfoHandler
// B) Use ConnectionProfileHandler.getConnectionProfile(connectionProfileInfo) to query the user to
// select a ConnectionProfile (or create new one)
// C) Get the resulting ConnectionProfileInfo from the dialog and re-set the model's connection info
// via the ConnectionProfileInfoHandler
IFile modelFile = (IFile)SelectionUtilities.getSelectedObjects(getSelection()).get(0);
ModelResource mr = ModelUtilities.getModelResourceForIFile(modelFile, true);
String existingName = connectionInfoHelper.getTranslatorName(mr);
// Query User for Translator name
String newTranslatorName = queryUserForTranslatorName(existingName);
if( !existingName.equals(newTranslatorName)) {
setTranslatorNameInTxn(mr, newTranslatorName);
}
}
private void setTranslatorNameInTxn(ModelResource modelResource, String translatorName) {
boolean requiredStart = ModelerCore.startTxn(true, true, "Set Translator Name", this); //$NON-NLS-1$
boolean succeeded = false;
try {
ModelEditor editor = ModelEditorManager.getModelEditorForFile((IFile)modelResource.getCorrespondingResource(), true);
if (editor != null) {
boolean isDirty = editor.isDirty();
connectionInfoHelper.setTranslatorName(modelResource, translatorName);
if (!isDirty && editor.isDirty()) {
editor.doSave(new NullProgressMonitor());
}
succeeded = true;
}
} catch (Exception e) {
MessageDialog.openError(Display.getCurrent().getActiveShell(),
DqpUiConstants.UTIL.getString("SetConnectionInfo.exceptionMessage"), e.getMessage()); //$NON-NLS-1$
IStatus status = new Status(IStatus.ERROR, DqpUiConstants.PLUGIN_ID,
DqpUiConstants.UTIL.getString("SetConnectionInfo.exceptionMessage"), e); //$NON-NLS-1$
DqpUiConstants.UTIL.log(status);
return;
} finally {
// if we started the txn, commit it.
if (requiredStart) {
if (succeeded) {
ModelerCore.commitTxn();
} else {
ModelerCore.rollbackTxn();
}
}
}
}
public String queryUserForTranslatorName( String existingName ) {
EnterTranslatorNameDialog dialog = new EnterTranslatorNameDialog(Display.getCurrent().getActiveShell(), existingName);
dialog.open();
if (dialog.getReturnCode() == Window.OK) {
return dialog.getTranslatorName();
}
return existingName;
}
/**
* @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);
}
@SuppressWarnings("rawtypes")
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;
}
class EnterTranslatorNameDialog extends Dialog {
//============================================================================================================================
// Constants
private static final int COLUMN_COUNT = 2;
//============================================================================================================================
// Variables
private Text translatorField;
private String translatorName;
private Collection<String> translatorNames = new ArrayList<String>();
private Combo translatorNameCombo;
//============================================================================================================================
// Constructors
/**<p>
* </p>
* @param parent
* @param title
* @since 4.0
*/
public EnterTranslatorNameDialog(final Shell shell, final String existingName) {
super(shell, DIALOG_TITLE);
this.translatorName = existingName;
}
//============================================================================================================================
// Overridden Methods
/**<p>
* </p>
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
* @since 4.0
*/
@Override
protected Control createDialogArea(final Composite parent) {
ITeiidServer server = TranslatorUtils.getDefaultServer();
boolean serverAvailable = (server != null && server.isConnected());
final Composite dlgPanel = (Composite)super.createDialogArea(parent);
GridData pgd = new GridData(SWT.BEGINNING, SWT.CENTER, true, true);
pgd.minimumWidth = 400;
pgd.grabExcessHorizontalSpace = true;
dlgPanel.setLayoutData(pgd);
((GridLayout)dlgPanel.getLayout()).numColumns = COLUMN_COUNT;
String message = DqpUiConstants.UTIL.getString("EnterTranslatorNameDialog.message"); //$NON-NLS-1$
if( serverAvailable ) {
message = DqpUiConstants.UTIL.getString("EnterTranslatorNameDialog.selectTranslatorMessage"); //$NON-NLS-1$
}
Label msgLabel = WidgetFactory.createLabel(dlgPanel, message);
GridData gd = new GridData(SWT.BEGINNING, SWT.CENTER, true, true);
gd.horizontalSpan = 2;
msgLabel.setLayoutData(gd);
if( !serverAvailable ) {
WidgetFactory.createLabel(dlgPanel, DqpUiConstants.UTIL.getString("EnterTranslatorNameDialog.nameLabel") + SPACE); //$NON-NLS-1$
this.translatorField = WidgetFactory.createTextField(dlgPanel);
if( this.translatorName != null && this.translatorName.length() > 0 ) {
this.translatorField.setText(this.translatorName);
}
this.translatorField.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if( translatorField.getText() != null && translatorField.getText().length() > 0 ) {
getButton(IDialogConstants.OK_ID).setEnabled(true);
translatorName = translatorField.getText();
} else {
translatorName = ""; //$NON-NLS-1$
getButton(IDialogConstants.OK_ID).setEnabled(false);
}
}
});
} else {
// -------------------------------------
// Combo for Translator selection
// -------------------------------------
Label translatorLabel = new Label(dlgPanel,SWT.NONE);
translatorLabel.setText("Translator");
/*
* Refresh the list of currently available translators on the server
*/
try {
translatorNames.clear();
Collection<ITeiidTranslator> availableTranslators = TranslatorUtils.getTranslators();
for(ITeiidTranslator translator: availableTranslators) {
translatorNames.add(translator.getName());
}
} catch (Exception ex) {
translatorNames.clear();
DqpUiPlugin.UTIL.log(ex);
}
this.translatorNameCombo = WidgetFactory.createCombo(dlgPanel,
SWT.READ_ONLY,
GridData.FILL_HORIZONTAL,
translatorNames.toArray());
this.translatorNameCombo.setVisibleItemCount(8);
this.translatorNameCombo.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
int selIndex = translatorNameCombo.getSelectionIndex();
translatorName = translatorNameCombo.getItem(selIndex);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
if( translatorName != null ) {
// walk through the metamodel classes and select the matching type
String[] names = translatorNameCombo.getItems();
for (int i = 0; i < names.length; i++) {
if (names[i].equalsIgnoreCase(translatorName)) {
translatorNameCombo.select(i);
break;
}
}
} else {
translatorNameCombo.select(-1);
}
}
return dlgPanel;
}
/**<p>
* </p>
* @see org.eclipse.jface.window.Window#create()
* @since 4.0
*/
@Override
public void create() {
super.create();
getButton(IDialogConstants.OK_ID).setEnabled(this.translatorName != null);
}
/**<p>
* </p>
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
* @since 4.0
*/
@Override
protected void okPressed() {
//pwd = pwdFld.getText();
super.okPressed();
}
/**
* @return password
*/
public String getTranslatorName() {
return translatorName;
}
}
}