/*
* 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.runtime.ui.server;
import static org.teiid.designer.runtime.ui.DqpUiConstants.UTIL;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.IHandlerListener;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.BaseSelectionListenerAction;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.runtime.DqpPlugin;
import org.teiid.designer.runtime.spi.IExecutionAdminFactory.SupportLevel;
import org.teiid.designer.runtime.spi.ITeiidServer;
import org.teiid.designer.runtime.spi.ITeiidServerManager;
import org.teiid.designer.runtime.ui.DqpUiConstants;
import org.teiid.designer.runtime.ui.DqpUiPlugin;
import org.teiid.designer.ui.common.util.WidgetUtil;
import org.teiid.designer.ui.common.viewsupport.UiBusyIndicator;
/**
*
*
* @since 8.0
*/
public class SetDefaultServerAction extends BaseSelectionListenerAction implements IHandler {
// ===========================================================================================================================
// Fields
// ===========================================================================================================================
/**
* The currently selected server
*/
private ITeiidServer selectedServer;
/**
* Default Constructor
*/
public SetDefaultServerAction() {
super(UTIL.getString("setDefaultServerActionText")); //$NON-NLS-1$
if (Platform.isRunning()) {
setToolTipText(UTIL.getString("setDefaultServerActionToolTip")); //$NON-NLS-1$
setImageDescriptor(DqpUiPlugin.getDefault().getImageDescriptor(DqpUiConstants.Images.SET_DEFAULT_SERVER_ICON));
}
}
// ===========================================================================================================================
// Methods
// ===========================================================================================================================
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
/*
* Since this action can now be run from the RuntimeAssistant then
* selectedServer may be null. In which case, need to ask the user
* which server to be selected
*/
if (this.selectedServer == null && !RuntimeAssistant.hasAvailableServers()) {
String title = UTIL.getString("noServerAvailableTitle"); //$NON-NLS-1$
String message = UTIL.getString("noServerAvailableMessage"); //$NON-NLS-1$
MessageDialog.openError(getShell(), title, message);
return;
}
else if (this.selectedServer == null) {
this.selectedServer = RuntimeAssistant.selectServer(getShell(), true);
if (RuntimeAssistant.selectServerWasCancelled()) return;
}
if (selectedServer == null) {
getServerManager().setDefaultServer(null);
String title = UTIL.getString("defaultServerChangedTitle"); //$NON-NLS-1$
String message = UTIL.getString("defaultServerChangedMessage", "No Default"); //$NON-NLS-1$ //$NON-NLS-2$
MessageDialog.openInformation(getShell(), title, message);
return;
}
ITeiidServer currentDefaultServer = this.getServerManager().getDefaultServer();
if (currentDefaultServer != null && currentDefaultServer.equals(selectedServer)) {
/*
* Selected is the same as current so nothing more to do
*/
String title = UTIL.getString("defaultServerUnchangedTitle"); //$NON-NLS-1$
String message = null;
if (getServerManager().getServers().size() == 1) {
/*
* User would not have been shown a server selection chooser
* since only one server is available. In this case, the server
* unchanged message should be clarified slightly.
*/
message = UTIL.getString("defaultServerUnchangedMessage1Server", //$NON-NLS-1$
currentDefaultServer.getParentName());
}
else {
/*
* More than 1 server so the user actively chose to keep this server rather
* than change it
*/
message = UTIL.getString("defaultServerUnchangedMessageMultiServer", //$NON-NLS-1$
currentDefaultServer.getParentName());
}
MessageDialog.openInformation(getShell(), title, message);
return;
}
/*
* If a server version change is occurring then tell the user and ask them if its
* alright to continue since this will close any open editors.
*/
boolean continueChangingServer = false;
if (changeOfServerVersion() && hasOpenEditors()) {
continueChangingServer = MessageDialog.openQuestion(getShell(),
UTIL.getString("setDefaultServerActionVersionChangeTitle"), //$NON-NLS-1$
UTIL.getString("setDefaultServerActionVersionChangeMessage")); //$NON-NLS-1$
if (! continueChangingServer)
return;
}
/*
* If a server version change is occurring and the new server has a version that is not full
* support then ask the user if it is ok to continue.
*/
continueChangingServer = false;
SupportLevel level = ModelerCore.getTeiidSupportLevel(selectedServer.getServerVersion());
switch (level) {
case FULL_SUPPORT:
continueChangingServer = true;
break;
case NO_SUPPORT:
MessageDialog.openError(getShell(),
UTIL.getString("setDefaultServerActionNoSupportTitle"), //$NON-NLS-1$
UTIL.getString("setDefaultServerActionNoSupportMessage")); //$NON-NLS-1$
continueChangingServer = false;
break;
case WORKS:
continueChangingServer = MessageDialog.openQuestion(getShell(),
UTIL.getString("setDefaultServerActionWorksChangeTitle"), //$NON-NLS-1$
UTIL.getString("setDefaultServerActionWorksChangeMessage")); //$NON-NLS-1$
}
if (! continueChangingServer)
return;
/*
* If old default teiid instance is connected, ask user if they wish to disconnect it.
*/
boolean disconnectOldDefault = false;
if( currentDefaultServer!=null && currentDefaultServer.isConnected() ) {
disconnectOldDefault = MessageDialog.openQuestion(getShell(),
UTIL.getString("setDefaultServerActionDisconnectOldTitle"), //$NON-NLS-1$
UTIL.getString("setDefaultServerActionDisconnectOldMessage", currentDefaultServer.getParentName())); //$NON-NLS-1$
}
if( disconnectOldDefault ) {
currentDefaultServer.disconnect();
}
/*
* Set the default Teiid Instance
*/
this.getServerManager().setDefaultServer(this.selectedServer);
/*
* If the new default teiid instance is connected then reconnect it to
* clear out any caches.
*/
if( this.selectedServer.isParentConnected() ) {
final ITeiidServer theNewDefaultServer = this.selectedServer;
UiBusyIndicator.showWhile(Display.getDefault(), new Runnable() {
@Override
public void run() {
// Call disconnect() first to clear out Server & admin caches
theNewDefaultServer.reconnect();
if (theNewDefaultServer.getConnectionError() != null)
WidgetUtil.showError(theNewDefaultServer.getConnectionError());
}
});
}
String title = UTIL.getString("defaultServerChangedTitle"); //$NON-NLS-1$
String serverName = selectedServer.getParentName();
String message = UTIL.getString("defaultServerChangedMessage", serverName); //$NON-NLS-1$
MessageDialog.openInformation(getShell(), title, message);
}
/**
* @return the server manager
*/
private ITeiidServerManager getServerManager() {
return DqpPlugin.getInstance().getServerManager();
}
private boolean hasOpenEditors() {
for (IWorkbenchWindow window : PlatformUI.getWorkbench().getWorkbenchWindows()) {
for (IWorkbenchPage page : window.getPages()) {
if (page.getEditorReferences().length > 0)
return true;
}
}
return false;
}
private boolean changeOfServerVersion() {
ITeiidServer currentDefaultServer = this.getServerManager().getDefaultServer();
if (currentDefaultServer == null)
return true;
return ! currentDefaultServer.getServerVersion().equals(selectedServer.getServerVersion());
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
*/
@Override
protected boolean updateSelection( IStructuredSelection selection ) {
// disable if empty selection
if (selection.size() != 1) {
return false;
}
// reset selected server collection
ITeiidServer teiidServer = RuntimeAssistant.getServerFromSelection(selection);
// enable only if selected object is server and not same server
if (teiidServer == null)
return false;
this.selectedServer = teiidServer;
// No default teiid instance selected so display the action to allow it
if (getServerManager().getDefaultServer() == null)
return true;
if (! this.selectedServer.equals(this.getServerManager().getDefaultServer()))
return true;
return false;
}
private static Shell getShell() {
return DqpUiPlugin.getDefault().getCurrentWorkbenchWindow().getShell();
}
@Override
public void addHandlerListener(IHandlerListener handlerListener) {
// Not required
}
@Override
public void dispose() {
// Not required
}
@Override
public Object execute(ExecutionEvent event) {
// This will be called from the handler service so the selected server is likely to be out-of-date
// so we need the dialog box to pop up to allow server selection.
selectedServer = null;
run();
return null;
}
@Override
public void removeHandlerListener(IHandlerListener handlerListener) {
// Not required
}
}