1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-29 11:13:34 +02:00

[274688] [api][dstore] DStoreConnectorService.internalConnect() needs to be cleaned up

This commit is contained in:
David McKnight 2009-05-04 12:44:14 +00:00
parent 859aa63098
commit c7858223a2

View file

@ -36,6 +36,7 @@
* David McKnight (IBM) - [233160] [dstore] SSL/non-SSL alert are not appropriate * David McKnight (IBM) - [233160] [dstore] SSL/non-SSL alert are not appropriate
* David Dykstal (IBM) [235284] Cancel password change causes problem * David Dykstal (IBM) [235284] Cancel password change causes problem
* David McKnight (IBM) - [267236] [dstore] Can't connect after a wrong password * David McKnight (IBM) - [267236] [dstore] Can't connect after a wrong password
* David McKnight (IBM) - [274688] [api][dstore] DStoreConnectorService.internalConnect() needs to be cleaned up
*******************************************************************************/ *******************************************************************************/
package org.eclipse.rse.connectorservice.dstore; package org.eclipse.rse.connectorservice.dstore;
@ -114,6 +115,23 @@ import org.osgi.framework.Version;
*/ */
public class DStoreConnectorService extends StandardConnectorService implements IDataStoreProvider public class DStoreConnectorService extends StandardConnectorService implements IDataStoreProvider
{ {
private class ConnectionStatusPair {
private ConnectionStatus _connectStatus;
private ConnectionStatus _launchStatus;
public ConnectionStatusPair(ConnectionStatus connectStatus, ConnectionStatus launchStatus){
_connectStatus = connectStatus;
_launchStatus = launchStatus;
}
public ConnectionStatus getConnectStatus(){
return _connectStatus;
}
public ConnectionStatus getLaunchStatus(){
return _launchStatus;
}
}
private class StartSpiritThread extends Thread private class StartSpiritThread extends Thread
{ {
private DataStore _dataStore; private DataStore _dataStore;
@ -166,17 +184,6 @@ public class DStoreConnectorService extends StandardConnectorService implements
} }
/*
* Set the subsystem, when its not known at constructor time
*
public void setSubSystem(SubSystem ss)
{
super.setSubSystem(ss);
setDaemonLaunchEnabled((SubSystemImpl)ss, false);
}*/
public int getServerVersion() public int getServerVersion()
{ {
return clientConnection.getServerVersion(); return clientConnection.getServerVersion();
@ -442,33 +449,6 @@ public class DStoreConnectorService extends StandardConnectorService implements
return dstorePath.getAbsolutePath(); return dstorePath.getAbsolutePath();
} }
// /**
// * Specify if you support connecting to a running daemon
// * @deprecated use {@link #enableServerLaunchType(ISubSystem, ServerLaunchType, boolean)}
// * or your subsystem factory should override {@link org.eclipse.rse.core.subsystems.SubSystemConfiguration#supportsServerLaunchType(ServerLaunchType)}
// */
// public void setDaemonLaunchEnabled(SubSystem subsystemImpl, boolean enable) {
// enableServerLaunchType(subsystemImpl, ServerLaunchType.DAEMON_LITERAL, enable);
// }
// /**
// * Return if you support connecting to a running daemon
// * @deprecated Use instead {@link #isEnabledServerLaunchType(ISubSystem, ServerLaunchType)}
// * or {@link org.eclipse.rse.core.subsystems.SubSystemConfiguration#supportsServerLaunchType(ServerLaunchType)}
// */
// public boolean getDaemonLaunchEnabled(SubSystem subsystemImpl) {
// return isEnabledServerLaunchType(subsystemImpl, ServerLaunchType.DAEMON_LITERAL);
// }
// /**
// * Specify if you support remotely launching a server script
// * @deprecated use {@link #enableServerLaunchType(ISubSystem, ServerLaunchType, boolean)}
// * or your subsystem factory should override {@link org.eclipse.rse.core.subsystems.SubSystemConfiguration#supportsServerLaunchType(ServerLaunchType)}
// */
// public void setRexecLaunchEnabled(SubSystem subsystemImpl, boolean enable) {
// enableServerLaunchType(subsystemImpl, ServerLaunchType.REXEC_LITERAL, enable);
// }
/** /**
* Return if you support remotely launching a server script * Return if you support remotely launching a server script
* @deprecated Use instead {@link #isServerLaunchTypeEnabled(ISubSystem, ServerLaunchType)} * @deprecated Use instead {@link #isServerLaunchTypeEnabled(ISubSystem, ServerLaunchType)}
@ -478,14 +458,6 @@ public class DStoreConnectorService extends StandardConnectorService implements
return isServerLaunchTypeEnabled(subsystemImpl, ServerLaunchType.REXEC_LITERAL); return isServerLaunchTypeEnabled(subsystemImpl, ServerLaunchType.REXEC_LITERAL);
} }
// /**
// * Specify if you support connecting to a server already running
// * @deprecated use {@link #enableServerLaunchType(ISubSystem, ServerLaunchType, boolean)}
// * or your subsystem factory should override {@link org.eclipse.rse.core.subsystems.SubSystemConfiguration#supportsServerLaunchType(ServerLaunchType)}
// */
// public void setNoLaunchEnabled(SubSystem subsystemImpl, boolean enable) {
// enableServerLaunchType(subsystemImpl, ServerLaunchType.RUNNING_LITERAL, enable);
// }
/** /**
* Return if you support connecting to a server already running * Return if you support connecting to a server already running
@ -524,72 +496,41 @@ public class DStoreConnectorService extends StandardConnectorService implements
} }
/** /**
* @see org.eclipse.rse.core.subsystems.IConnectorService#connect(IProgressMonitor) * Connect to the server by using REXEC as a daemon to launch it.
*
* @param info the signon information
* @param serverLauncher the server launcher
* @param monitor the progress monitor
*
* @return the connection status
*
* @since 3.1
*/ */
protected void internalConnect(IProgressMonitor monitor) throws Exception protected ConnectionStatus connectWithREXEC(SystemSignonInformation info, IRemoteServerLauncher serverLauncher, IProgressMonitor monitor) throws Exception {
{ if (monitor != null) {
if (isConnected() || _isConnecting) {
return;
}
_isConnecting = true;
boolean alertedNONSSL = false;
// set A_PLUGIN_PATH so that dstore picks up the property
setPluginPathProperty();
// Fire comm event to signal state about to change
fireCommunicationsEvent(CommunicationsEvent.BEFORE_CONNECT);
ConnectionStatus connectStatus = null;
ConnectionStatus launchStatus = null;
clientConnection = new ClientConnection(getPrimarySubSystem().getHost().getAliasName());
clientConnection.setHost(getHostName());
clientConnection.setPort(Integer.toString(getPort()));
// ISubSystem ss = getPrimarySubSystem();
getPrimarySubSystem();
IRemoteServerLauncher serverLauncher = getDStoreServerLauncher();
ServerLaunchType serverLauncherType = null;
boolean autoDetectSSL = true;
if (serverLauncher != null)
{
serverLauncherType = serverLauncher.getServerLaunchType();
autoDetectSSL = serverLauncher.getAutoDetectSSL();
}
else
{
// System.out.println("server launcher is null");
}
//long t1 = System.currentTimeMillis();
SystemMessage msg = null;
boolean launchFailed = false;
// get Socket Timeout Value Preference
int timeout = getSocketTimeOutValue();
if (serverLauncherType == ServerLaunchType.REXEC_LITERAL)
{
if (monitor != null)
{
String cmsg = ConnectorServiceResources.MSG_STARTING_SERVER_VIA_REXEC; String cmsg = ConnectorServiceResources.MSG_STARTING_SERVER_VIA_REXEC;
monitor.subTask(cmsg); monitor.subTask(cmsg);
} }
SystemSignonInformation info = getSignonInformation(); ConnectionStatus connectStatus = null;
boolean autoDetectSSL = true;
if (serverLauncher != null){
autoDetectSSL = serverLauncher.getAutoDetectSSL();
}
// GC: - if failed to get a connection in another way, try // GC: - if failed to get a connection in another way, try
// starting the datastore server with rexec // starting the datastore server with rexec
IServerLauncher starter = getRemoteServerLauncher(); IServerLauncher starter = getRemoteServerLauncher();
starter.setSignonInformation(info); starter.setSignonInformation(info);
starter.setServerLauncherProperties(serverLauncher); starter.setServerLauncherProperties(serverLauncher);
// get Socket Timeout Value Preference
int timeout = getSocketTimeOutValue();
if (starter instanceof RexecDstoreServer){ if (starter instanceof RexecDstoreServer){
((RexecDstoreServer)starter).setSocketTimeoutValue(timeout); ((RexecDstoreServer)starter).setSocketTimeoutValue(timeout);
} }
if (autoDetectSSL) timeout = 3000; if (autoDetectSSL) timeout = 3000;
else setSSLProperties(isUsingSSL()); else setSSLProperties(isUsingSSL());
@ -599,18 +540,15 @@ public class DStoreConnectorService extends StandardConnectorService implements
{ {
clientConnection.setPort("" + iServerPort); //$NON-NLS-1$ clientConnection.setPort("" + iServerPort); //$NON-NLS-1$
if (monitor != null) if (monitor != null) {
{
String cmsg = NLS.bind(ConnectorServiceResources.MSG_CONNECTING_TO_SERVER, clientConnection.getPort()); String cmsg = NLS.bind(ConnectorServiceResources.MSG_CONNECTING_TO_SERVER, clientConnection.getPort());
monitor.subTask(cmsg); monitor.subTask(cmsg);
} }
// connect to launched server // connect to launched server
connectStatus = clientConnection.connect(null, timeout); connectStatus = clientConnection.connect(null, timeout);
if (!connectStatus.isConnected() && connectStatus.getMessage().startsWith(ClientConnection.CANNOT_CONNECT) && autoDetectSSL) if (!connectStatus.isConnected() && connectStatus.getMessage().startsWith(ClientConnection.CANNOT_CONNECT) && autoDetectSSL){
{ if (setSSLProperties(true)){
if (setSSLProperties(true))
{
iServerPort = launchUsingRexec(info, serverLauncher, monitor); iServerPort = launchUsingRexec(info, serverLauncher, monitor);
if (iServerPort != 0) if (iServerPort != 0)
{ {
@ -620,11 +558,9 @@ public class DStoreConnectorService extends StandardConnectorService implements
} }
} }
} }
else else {
{
launchFailed = true;
connectStatus = new ConnectionStatus(false); connectStatus = new ConnectionStatus(false);
msg = starter.getErrorMessage(); SystemMessage msg = starter.getErrorMessage();
String errorMsg = null; String errorMsg = null;
if (msg == null) if (msg == null)
{ {
@ -636,42 +572,47 @@ public class DStoreConnectorService extends StandardConnectorService implements
} }
connectStatus.setMessage(errorMsg); connectStatus.setMessage(errorMsg);
} }
return connectStatus;
} }
// Start the server via the daemon
else if (serverLauncherType == ServerLaunchType.DAEMON_LITERAL) /**
{ * Connection to a server via the RSE daemon.
if (monitor != null) *
{ * @param info the signon information
* @param serverLauncher the server launcher
* @param alertedNONSSL indication of whether an alert for NON-ssl has already been issued
* @param monitor the progress monitor
*
* @return a pair of connection statuses - the launch status for the daemon and the connect status for the server
* @since 3.1
*/
protected ConnectionStatusPair connectWithDaemon(SystemSignonInformation info, IRemoteServerLauncher serverLauncher, Boolean alertedNONSSL, IProgressMonitor monitor) throws InterruptedException {
if (monitor != null) {
String cmsg = ConnectorServiceResources.MSG_STARTING_SERVER_VIA_DAEMON; String cmsg = ConnectorServiceResources.MSG_STARTING_SERVER_VIA_DAEMON;
monitor.subTask(cmsg); monitor.subTask(cmsg);
} }
ConnectionStatus connectStatus = null;
// DY: getLocalUserId() may return null for Windows connections because // DY: getLocalUserId() may return null for Windows connections because
// we no longer prompt for userid / pwd. But for other connections the userid // we no longer prompt for userid / pwd. But for other connections the userid
// should be the same as the one stored in the password info (and for Windows // should be the same as the one stored in the password info (and for Windows
// this will be the temp remoteuser userid. // this will be the temp remoteuser userid.
//launchStatus = clientConnection.launchServer(getLocalUserId(), getPassword(getPasswordInformation())); //launchStatus = clientConnection.launchServer(getLocalUserId(), getPassword(getPasswordInformation()));
SystemSignonInformation info = getSignonInformation();
if (info == null)
{
SystemBasePlugin.logError("password info = null!"); //$NON-NLS-1$
}
int daemonPort = 0; int daemonPort = 0;
if (serverLauncher != null) if (serverLauncher != null)
daemonPort = serverLauncher.getDaemonPort(); daemonPort = serverLauncher.getDaemonPort();
/* String daemonPortStr = getSubSystem().getVendorAttribute("Remote", "DAEMON_PORT"); // 205986 FIRST TRY SSL, THEN NON-SECURE!
if (daemonPortStr != null && daemonPortStr.length() > 0)
{
daemonPort = Integer.parseInt(daemonPortStr);
}*/
// 205986] FIRST TRY SSL, THEN NON-SECURE!
boolean usedSSL = true; boolean usedSSL = true;
setSSLProperties(true); setSSLProperties(true);
launchStatus = launchServer(clientConnection, info, daemonPort, monitor, timeout); // get Socket Timeout Value Preference
int timeout = getSocketTimeOutValue();
ConnectionStatus launchStatus = launchServer(clientConnection, info, daemonPort, monitor, timeout);
if (!launchStatus.isConnected() && !clientConnection.isKnownStatus(launchStatus.getMessage())) if (!launchStatus.isConnected() && !clientConnection.isKnownStatus(launchStatus.getMessage()))
{ {
Throwable conE = launchStatus.getException(); Throwable conE = launchStatus.getException();
@ -681,16 +622,12 @@ public class DStoreConnectorService extends StandardConnectorService implements
if (certs != null && certs.size() > 0) if (certs != null && certs.size() > 0)
{ {
ISystemKeystoreProvider provider = SystemKeystoreProviderManager.getInstance().getDefaultProvider(); ISystemKeystoreProvider provider = SystemKeystoreProviderManager.getInstance().getDefaultProvider();
if (provider != null) if (provider != null){
{ if (provider.importCertificates(certs, getHostName())){
_isConnecting = false; return connectWithDaemon(info, serverLauncher, alertedNONSSL, monitor);
if (provider.importCertificates(certs, getHostName()))
{
internalConnect(monitor);
return;
} }
else else{
{ _isConnecting = false;
throw new InterruptedException(); throw new InterruptedException();
} }
} }
@ -708,14 +645,14 @@ public class DStoreConnectorService extends StandardConnectorService implements
if (store.getBoolean(ISystemPreferencesConstants.ALERT_NONSSL)) if (store.getBoolean(ISystemPreferencesConstants.ALERT_NONSSL))
{ {
String cmsg = NLS.bind(ConnectorServiceResources.MSG_COMM_NOT_USING_SSL, getHostName()); String cmsg = NLS.bind(ConnectorServiceResources.MSG_COMM_NOT_USING_SSL, getHostName());
msg = createSystemMessage(IConnectorServiceMessageIds.MSG_COMM_NOT_USING_SSL, IStatus.INFO, cmsg); SystemMessage msg = createSystemMessage(IConnectorServiceMessageIds.MSG_COMM_NOT_USING_SSL, IStatus.INFO, cmsg);
DisplayHidableSystemMessageAction msgAction = new DisplayHidableSystemMessageAction(msg, store, ISystemPreferencesConstants.ALERT_NONSSL); DisplayHidableSystemMessageAction msgAction = new DisplayHidableSystemMessageAction(msg, store, ISystemPreferencesConstants.ALERT_NONSSL);
Display.getDefault().syncExec(msgAction); Display.getDefault().syncExec(msgAction);
if (msgAction.getReturnCode() != IDialogConstants.YES_ID){ if (msgAction.getReturnCode() != IDialogConstants.YES_ID){
allowNonSSL = false; allowNonSSL = false;
} else { } else {
alertedNONSSL = true; alertedNONSSL = new Boolean(true); // changing value to true
} }
} }
if (allowNonSSL){ if (allowNonSSL){
@ -730,8 +667,7 @@ public class DStoreConnectorService extends StandardConnectorService implements
} }
} }
if (!launchStatus.isConnected()) if (!launchStatus.isConnected()) { // launch failed
{
String launchMsg = launchStatus.getMessage(); String launchMsg = launchStatus.getMessage();
// If password has expired and must be changed // If password has expired and must be changed
if (launchMsg != null && (isPasswordExpired(launchMsg) || isNewPasswordInvalid(launchMsg))) if (launchMsg != null && (isPasswordExpired(launchMsg) || isNewPasswordInvalid(launchMsg)))
@ -767,22 +703,16 @@ public class DStoreConnectorService extends StandardConnectorService implements
launchStatus = changePassword(clientConnection, oldCredentials, serverLauncher, monitor, newCredentials.getPassword()); launchStatus = changePassword(clientConnection, oldCredentials, serverLauncher, monitor, newCredentials.getPassword());
launchMsg = launchStatus.getMessage(); launchMsg = launchStatus.getMessage();
} }
if (newCredentials != null) if (newCredentials != null){
{
info = newCredentials; info = newCredentials;
} }
if (launchMsg != null && launchMsg.equals(IDataStoreConstants.ATTEMPT_RECONNECT)) if (launchMsg != null && launchMsg.equals(IDataStoreConstants.ATTEMPT_RECONNECT)){
{ return connectWithDaemon(info, serverLauncher, alertedNONSSL, monitor);
_isConnecting = false;
internalConnect(monitor);
return;
} }
} }
else if (launchMsg != null && isPortOutOfRange(launchMsg)) else if (launchMsg != null && isPortOutOfRange(launchMsg))
{ {
_isConnecting = false; _isConnecting = false;
launchFailed = true;
int colonIndex = launchMsg.indexOf(':'); int colonIndex = launchMsg.indexOf(':');
String portRange = launchMsg.substring(colonIndex + 1); String portRange = launchMsg.substring(colonIndex + 1);
@ -790,18 +720,17 @@ public class DStoreConnectorService extends StandardConnectorService implements
String pmsg =NLS.bind(ConnectorServiceResources.MSG_PORT_OUT_RANGE, portRange); String pmsg =NLS.bind(ConnectorServiceResources.MSG_PORT_OUT_RANGE, portRange);
SystemMessage message = createSystemMessage(IConnectorServiceMessageIds.MSG_PORT_OUT_RANGE, IStatus.ERROR, pmsg); SystemMessage message = createSystemMessage(IConnectorServiceMessageIds.MSG_PORT_OUT_RANGE, IStatus.ERROR, pmsg);
// message handled here
ShowConnectMessage msgAction = new ShowConnectMessage(message); ShowConnectMessage msgAction = new ShowConnectMessage(message);
Display.getDefault().asyncExec(msgAction); Display.getDefault().asyncExec(msgAction);
return; return null; // null here indicates no further processing required by internalConnect
} }
else else
{ {
launchFailed = true;
SystemBasePlugin.logError("Error launching server: " + launchStatus.getMessage(), null); //$NON-NLS-1$ SystemBasePlugin.logError("Error launching server: " + launchStatus.getMessage(), null); //$NON-NLS-1$
} }
} }
if (launchStatus.isConnected()) else { // launch succeeded
{
if (monitor != null) if (monitor != null)
{ {
if (clientConnection == null){ if (clientConnection == null){
@ -813,107 +742,92 @@ public class DStoreConnectorService extends StandardConnectorService implements
// connect to launched server // connect to launched server
connectStatus = clientConnection.connect(launchStatus.getTicket(), timeout); connectStatus = clientConnection.connect(launchStatus.getTicket(), timeout);
Throwable conE = connectStatus.getException(); Throwable conE = connectStatus.getException();
if (!connectStatus.isConnected() &&
(connectStatus.getMessage().startsWith(ClientConnection.CANNOT_CONNECT) ||
conE instanceof SSLException
)
)
{
_isConnecting = false;
if (conE instanceof SSLHandshakeException)
{
List certs = connectStatus.getUntrustedCertificates();
if (certs != null && certs.size() > 0)
{
ISystemKeystoreProvider provider = SystemKeystoreProviderManager.getInstance().getDefaultProvider();
if (provider != null)
{
if (provider.importCertificates(certs, getHostName())) if (!connectStatus.isConnected() &&
{ (connectStatus.getMessage().startsWith(ClientConnection.CANNOT_CONNECT) || conE instanceof SSLException)) { // failed to connect to the server that was launched
internalConnect(monitor); if (conE instanceof SSLHandshakeException){ // cause of failure was an SSL handshake exception
return; List certs = connectStatus.getUntrustedCertificates();
if (certs != null && certs.size() > 0) {
ISystemKeystoreProvider provider = SystemKeystoreProviderManager.getInstance().getDefaultProvider();
if (provider != null){
if (provider.importCertificates(certs, getHostName())) { // import the certificates and try again
return connectWithDaemon(info, serverLauncher, alertedNONSSL, monitor);
} }
else else {
{ _isConnecting = false;
throw new InterruptedException(); throw new InterruptedException();
} }
} }
} }
}
} // relaunching the server via the daemon so that we can connect again to the launched server with toggled useSSL settings
launchStatus = launchServer(clientConnection, info, daemonPort, monitor); launchStatus = launchServer(clientConnection, info, daemonPort, monitor);
if (!launchStatus.isConnected()) if (launchStatus.isConnected()) {
{ if (setSSLProperties(!usedSSL)){
launchFailed = true;
}
else
{
if (setSSLProperties(!usedSSL))
{
connectStatus = clientConnection.connect(launchStatus.getTicket(), timeout); connectStatus = clientConnection.connect(launchStatus.getTicket(), timeout);
} }
} }
} }
// failure to connect diagnosis - not sure why this is here since I would expect this case was already handled
// leaving it here just in case - will review later
if (!connectStatus.isConnected() && connectStatus.isSLLProblem()) if (!connectStatus.isConnected() && connectStatus.isSLLProblem())
{ {
List certs = connectStatus.getUntrustedCertificates();
if (certs != null && certs.size() > 0) {
ISystemKeystoreProvider provider = SystemKeystoreProviderManager.getInstance().getDefaultProvider();
if (provider != null) {
if (provider.importCertificates(certs, getHostName())){
return connectWithDaemon(info, serverLauncher, alertedNONSSL, monitor);
}
else {
_isConnecting = false; _isConnecting = false;
importCertsAndReconnect(connectStatus, monitor); throw new InterruptedException();
return; }
}
}
}
} }
/* return new ConnectionStatusPair(connectStatus, launchStatus);
if (connectStatus != null && connectStatus.getMessage().startsWith(ClientConnection.INCOMPATIBLE_UPDATE))
{
// offer to update it
clientConnection.getDataStore().queryInstall();
} }
/**
* Connect to a running server.
*
* @param monitor the progress monitor
*
* @return the connection status
* @since 3.1
*/ */
} protected ConnectionStatus connectWithRunning(IProgressMonitor monitor){
else
{
connectStatus = new ConnectionStatus(false);
String cmsg = NLS.bind(ConnectorServiceResources.MSG_COMM_CONNECT_FAILED, getHostName());
connectStatus.setMessage(cmsg);
}
}
else if (serverLauncherType == ServerLaunchType.RUNNING_LITERAL)
{
if (monitor != null) if (monitor != null)
{ {
String cmsg = NLS.bind(ConnectorServiceResources.MSG_CONNECTING_TO_SERVER, clientConnection.getPort()); String cmsg = NLS.bind(ConnectorServiceResources.MSG_CONNECTING_TO_SERVER, clientConnection.getPort());
monitor.subTask(cmsg); monitor.subTask(cmsg);
} }
// connection directly // connect directly
boolean useSSL = isUsingSSL(); boolean useSSL = isUsingSSL();
setSSLProperties(useSSL); setSSLProperties(useSSL);
connectStatus = clientConnection.connect(null, timeout);
} // get Socket Timeout Value Preference
// server launcher type is unknown int timeout = getSocketTimeOutValue();
else return clientConnection.connect(null, timeout);
{
SystemSignonInformation info = getSignonInformation();
connectStatus = launchServer(clientConnection, info, serverLauncher, monitor);
if (!connectStatus.isConnected() && !clientConnection.isKnownStatus(connectStatus.getMessage()))
{
if (setSSLProperties(true))
{
connectStatus = launchServer(clientConnection, info, serverLauncher, monitor);
if (!connectStatus.isConnected() && connectStatus.isSLLProblem())
{
_isConnecting = false;
importCertsAndReconnect(connectStatus, monitor);
return;
}
}
} }
} /**
* Initialize the DataStore connection.
// if connected *
if (connectStatus != null && connectStatus.isConnected()) * @param launchStatus the launch status if the server was launched via the daemon. Otherwise, null.
{ * @param connectStatus the connect status for the server
* @param alertedNONSSL a boolean indicating whether the user has been alerted to a NON-ssl connection
* @param monitor the status monitor
*
* @since 3.1
*/
protected void initializeConnection(ConnectionStatus launchStatus, ConnectionStatus connectStatus, Boolean alertedNONSSL, IProgressMonitor monitor) throws Exception {
SystemMessage msg = null;
IPreferenceStore store = RSEUIPlugin.getDefault().getPreferenceStore(); IPreferenceStore store = RSEUIPlugin.getDefault().getPreferenceStore();
if (clientConnection.getDataStore().usingSSL() && store.getBoolean(ISystemPreferencesConstants.ALERT_SSL)) if (clientConnection.getDataStore().usingSSL() && store.getBoolean(ISystemPreferencesConstants.ALERT_SSL))
{ {
@ -931,7 +845,7 @@ public class DStoreConnectorService extends StandardConnectorService implements
} }
else if (!clientConnection.getDataStore().usingSSL() && store.getBoolean(ISystemPreferencesConstants.ALERT_NONSSL)) else if (!clientConnection.getDataStore().usingSSL() && store.getBoolean(ISystemPreferencesConstants.ALERT_NONSSL))
{ {
if (!alertedNONSSL){ // only alert if we haven't already if (!alertedNONSSL.booleanValue()){ // only alert if we haven't already
String cmsg = NLS.bind(ConnectorServiceResources.MSG_COMM_NOT_USING_SSL, getHostName()); String cmsg = NLS.bind(ConnectorServiceResources.MSG_COMM_NOT_USING_SSL, getHostName());
msg = createSystemMessage(IConnectorServiceMessageIds.MSG_COMM_NOT_USING_SSL, IStatus.INFO, cmsg); msg = createSystemMessage(IConnectorServiceMessageIds.MSG_COMM_NOT_USING_SSL, IStatus.INFO, cmsg);
@ -951,34 +865,18 @@ public class DStoreConnectorService extends StandardConnectorService implements
_connectionStatusListener = new ConnectionStatusListener(dataStore.getStatus(), this); _connectionStatusListener = new ConnectionStatusListener(dataStore.getStatus(), this);
dataStore.getDomainNotifier().addDomainListener(_connectionStatusListener); dataStore.getDomainNotifier().addDomainListener(_connectionStatusListener);
// DKM: dataStore needs a miners location
// for now, I'll use dstore.miners as default location
// (I've inserted the universal miner in it's minerFile.dat file)
// DY: defect 46811 The minerFile.dat does not exist in this directory which causes a
// java.io.FileNotFoundException to be printed to the console (not very
// encouraging for the end user.) So I'm setting it to the current directory (.)
// which should be where the code is run from
//dataStore.addMinersLocation("org.eclipse.dstore.miners");
StatusMonitor statusMonitor = StatusMonitorFactory.getInstance().getStatusMonitorFor(this, dataStore); StatusMonitor statusMonitor = StatusMonitorFactory.getInstance().getStatusMonitorFor(this, dataStore);
if (launchStatus != null && launchStatus.isConnected()) if (launchStatus != null && launchStatus.isConnected())
{ {
//dataStore.showTicket(launchStatus.getTicket()); // send security token to server, this must be done first
DataElement ticket = dataStore.createTicket(launchStatus.getTicket()); DataElement ticket = dataStore.createTicket(launchStatus.getTicket());
dataStore.queryShowTicket(ticket); dataStore.queryShowTicket(ticket);
//statusMonitor.waitForUpdate(ticketStatus);
} }
else else
{ {
dataStore.showTicket(null); dataStore.showTicket(null);
} }
// if (dataStore.isDoSpirit()) dataStore.queryServerSpiritState();
StartSpiritThread thread = new StartSpiritThread(dataStore); StartSpiritThread thread = new StartSpiritThread(dataStore);
thread.start(); thread.start();
@ -1057,13 +955,28 @@ public class DStoreConnectorService extends StandardConnectorService implements
DataElement initStatus = dataStore.initMiners(); DataElement initStatus = dataStore.initMiners();
statusMonitor.waitForUpdate(initStatus); statusMonitor.waitForUpdate(initStatus);
} }
//long t2 = System.currentTimeMillis();
//System.out.println("connect time = "+(t2 - t1));
} }
else
/**
* Diagnostics the occurs after the failure of a connect.
*
* @param launchStatus the status of the launching of the server (if a daemon was used)
* @param connectStatus the status of the connecting to the server
* @param serverLauncher the server launcher
* @param serverLauncherType the type of server launcher
* @param monitor the progress monitor
*
* @since 3.1
*/
protected void handleConnectionFailure(ConnectionStatus launchStatus, ConnectionStatus connectStatus, IRemoteServerLauncher serverLauncher, ServerLaunchType serverLauncherType, IProgressMonitor monitor) throws Exception
{ {
SystemMessage msg = null;
boolean launchFailed = false;
if (launchStatus != null){
launchFailed = !launchStatus.isConnected();
}
// if daemon launch failed because of an SSL problem // if daemon launch failed because of an SSL problem
if (launchFailed && launchStatus != null && launchStatus.isSLLProblem()) if (launchFailed && launchStatus.isSLLProblem())
{ {
if (launchStatus.isSLLProblem()) if (launchStatus.isSLLProblem())
{ {
@ -1235,7 +1148,7 @@ public class DStoreConnectorService extends StandardConnectorService implements
{ {
_isConnecting = false; _isConnecting = false;
provider.importCertificates(certs, getHostName()); provider.importCertificates(certs, getHostName());
_isConnecting = false;
// Don't attempt reconnect when server was started manually. The problem is that // Don't attempt reconnect when server was started manually. The problem is that
// in that situation, the server will have terminated on the failed connection // in that situation, the server will have terminated on the failed connection
@ -1326,6 +1239,81 @@ public class DStoreConnectorService extends StandardConnectorService implements
_isConnecting = false; _isConnecting = false;
throw new SystemMessageException(msg); throw new SystemMessageException(msg);
}
/**
* @see org.eclipse.rse.core.subsystems.IConnectorService#connect(IProgressMonitor)
*/
protected void internalConnect(IProgressMonitor monitor) throws Exception
{
if (isConnected() || _isConnecting) {
return;
}
_isConnecting = true;
Boolean alertedNONSSL = new Boolean(false);
// set A_PLUGIN_PATH so that dstore picks up the property
setPluginPathProperty();
// Fire comm event to signal state about to change
fireCommunicationsEvent(CommunicationsEvent.BEFORE_CONNECT);
ConnectionStatus connectStatus = null;
ConnectionStatus launchStatus = null;
clientConnection = new ClientConnection(getPrimarySubSystem().getHost().getAliasName());
clientConnection.setHost(getHostName());
clientConnection.setPort(Integer.toString(getPort()));
getPrimarySubSystem();
IRemoteServerLauncher serverLauncher = getDStoreServerLauncher();
ServerLaunchType serverLauncherType = null;
if (serverLauncher != null){
serverLauncherType = serverLauncher.getServerLaunchType();
}
SystemSignonInformation info = getSignonInformation();
if (serverLauncherType == ServerLaunchType.REXEC_LITERAL){ // start the server via REXEC
connectStatus = connectWithREXEC(info, serverLauncher, monitor);
}
else if (serverLauncherType == ServerLaunchType.DAEMON_LITERAL) { // start the server via the daemon
ConnectionStatusPair connectStatusPair = connectWithDaemon(info, serverLauncher, alertedNONSSL, monitor);
connectStatus = connectStatusPair.getConnectStatus();
launchStatus = connectStatusPair.getLaunchStatus();
if (connectStatus == null){
return; // error handling completed
}
}
else if (serverLauncherType == ServerLaunchType.RUNNING_LITERAL){ // connect to running server
connectStatus = connectWithRunning(monitor);
}
else { // server launcher type is unknown
connectStatus = launchServer(clientConnection, info, serverLauncher, monitor);
if (!connectStatus.isConnected() && !clientConnection.isKnownStatus(connectStatus.getMessage())){
if (connectStatus.isSLLProblem()){
if (setSSLProperties(true)){
connectStatus = launchServer(clientConnection, info, serverLauncher, monitor);
if (!connectStatus.isConnected() && connectStatus.isSLLProblem()){
_isConnecting = false;
importCertsAndReconnect(connectStatus, monitor);
return;
}
}
}
}
}
if (connectStatus != null && connectStatus.isConnected()){ // connected
initializeConnection(launchStatus, connectStatus, alertedNONSSL, monitor);
}
else { // diagnosis, reconnection and other connection failure handling
handleConnectionFailure(connectStatus, launchStatus, serverLauncher, serverLauncherType, monitor);
} }
_isConnecting = false; _isConnecting = false;
} }