package org.teiid.designer.datatools.ui.actions;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
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.core.designer.util.I18nUtil;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.datatools.connection.ConnectionInfoProviderFactory;
import org.teiid.designer.datatools.connection.IConnectionInfoProvider;
import org.teiid.designer.datatools.ui.DatatoolsUiConstants;
import org.teiid.designer.datatools.ui.DatatoolsUiPlugin;
import org.teiid.designer.datatools.ui.dialogs.ConnectionProfileSummaryDialog;
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.viewsupport.ModelIdentifier;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* @since 8.0
*/
public class ViewConnectionProfileAction extends SortableSelectionAction implements IConnectionAction {
private static final String I18N_PREFIX = I18nUtil.getPropertyPrefix(ViewConnectionProfileAction.class);
private static final String TITLE = getString("title"); //$NON-NLS-1$
private static String getString( final String id ) {
return DatatoolsUiConstants.UTIL.getString(I18N_PREFIX + id);
}
private static String getString( final String id,
final Object value ) {
return DatatoolsUiConstants.UTIL.getString(I18N_PREFIX + id, value);
}
private ConnectionInfoProviderFactory providerFactory;
/**
* @since 5.0
*/
public ViewConnectionProfileAction() {
super(TITLE, SWT.DEFAULT);
setImageDescriptor(DatatoolsUiPlugin.getDefault().getImageDescriptor(DatatoolsUiConstants.Images.VIEW_CONNECTION_ICON));
providerFactory = new ConnectionInfoProviderFactory();
}
/**
* @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() {
ModelResource modelResource = null;
if (!getSelection().isEmpty()) {
IFile modelFile = (IFile)SelectionUtilities.getSelectedObjects(getSelection()).get(0);
modelResource = ModelUtilities.getModelResource(modelFile);
}
if( modelResource != null) {
Properties props = getModelConnectionProperties(modelResource);
if( props == null || props.isEmpty() ) {
MessageDialog.openInformation(getShell(), getString("noInfo.title"), //$NON-NLS-1$
getString("noInfo.message", modelResource.getItemName())); //$NON-NLS-1$
return;
}
String name = modelResource.getItemName();
ConnectionProfileSummaryDialog dialog = new ConnectionProfileSummaryDialog(getShell(), name, props);
dialog.open();
}
}
private Properties getModelConnectionProperties(ModelResource mr) {
try {
if (ModelIdentifier.isRelationalSourceModel(mr)) {
IConnectionInfoProvider provider = null;
try {
provider = getProvider(mr);
} catch (Exception e) {
// If provider throws exception its OK because some models may not have connection info.
}
if (provider != null) {
Properties properties = provider.getProfileProperties(mr); //ConnectionProperties(mr);
Properties p2 = provider.getConnectionProperties(mr);
String translatorName = provider.getTranslatorName(mr);
for( Object key : p2.keySet()) {
properties.put(key, p2.get(key));
}
if( translatorName != null ) {
properties.put(getString("translatorKey"), translatorName); //$NON-NLS-1$
}
if (properties != null && !properties.isEmpty()) {
return properties;
}
}
}
} catch (CoreException e) {
DatatoolsUiConstants.UTIL.log(e);
}
return null;
}
/**
* @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);
}
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;
}
public IConnectionInfoProvider getProvider( ModelResource modelResource ) throws Exception {
IConnectionInfoProvider provider = null;
provider = providerFactory.getProvider(modelResource);
if (null == provider) {
throw new Exception(getString("noConnectionInfoProvider.message")); //$NON-NLS-1$
}
return provider;
}
private Shell getShell() {
return Display.getCurrent().getActiveShell();
}
}