diff --git a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialConnector.java b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialConnector.java index f4f7ead640f..9d431499080 100644 --- a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialConnector.java +++ b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialConnector.java @@ -15,6 +15,7 @@ * Martin Oberhuber (Wind River) - fixed copyright headers and beautified * Martin Oberhuber (Wind River) - [206892] Don't connect if already connecting * Martin Oberhuber (Wind River) - [208029] COM port not released after quick disconnect/reconnect + * Martin Oberhuber (Wind River) - [225853][api] Provide more default functionality in TerminalConnectorImpl *******************************************************************************/ package org.eclipse.tm.internal.terminal.serial; @@ -38,7 +39,6 @@ import org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnect public class SerialConnector extends TerminalConnectorImpl { private OutputStream fOutputStream; private InputStream fInputStream; - private ITerminalControl fControl; private SerialPort fSerialPort; private CommPortIdentifier fSerialPortIdentifier; private SerialPortHandler fTerminalSerialPortHandler; @@ -60,7 +60,7 @@ public class SerialConnector extends TerminalConnectorImpl { } } public void connect(ITerminalControl control) { - Logger.log("entered."); //$NON-NLS-1$ + super.connect(control); synchronized(this) { if (fConnectWorker!=null || fDisconnectGoingOn) { //avoid multiple background connect/disconnect threads at the same time @@ -68,7 +68,6 @@ public class SerialConnector extends TerminalConnectorImpl { } fConnectWorker = new SerialConnectWorker(this, control); } - fControl=control; fControl.setState(TerminalState.CONNECTING); fConnectWorker.start(); } @@ -80,8 +79,7 @@ public class SerialConnector extends TerminalConnectorImpl { fConnectWorker = null; } } - public void disconnect() { - Logger.log("entered."); //$NON-NLS-1$ + public void doDisconnect() { synchronized(this) { //avoid multiple background connect/disconnect threads at the same time if (fConnectWorker!=null) { @@ -140,9 +138,9 @@ public class SerialConnector extends TerminalConnectorImpl { } } - if (getOutputStream() != null) { + if (getTerminalToRemoteStream() != null) { try { - getOutputStream().close(); + getTerminalToRemoteStream().close(); } catch (Exception exception) { Logger.logException(exception); } @@ -159,12 +157,11 @@ public class SerialConnector extends TerminalConnectorImpl { } }.start(); - fControl.setState(TerminalState.CLOSED); } public InputStream getInputStream() { return fInputStream; } - public OutputStream getOutputStream() { + public OutputStream getTerminalToRemoteStream() { return fOutputStream; } private void setInputStream(InputStream inputStream) { @@ -173,13 +170,9 @@ public class SerialConnector extends TerminalConnectorImpl { private void setOutputStream(OutputStream outputStream) { fOutputStream = outputStream; } - public boolean isLocalEcho() { - return false; - } public void setTerminalSize(int newWidth, int newHeight) { // TODO } - protected SerialPort getSerialPort() { return fSerialPort; } diff --git a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshConnector.java b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshConnector.java index 9485405c1d8..0ebfb5968e3 100644 --- a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshConnector.java +++ b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshConnector.java @@ -9,6 +9,7 @@ * Michael Scharf (Wind River) - initial API and implementation * Martin Oberhuber (Wind River) - fixed copyright headers and beautified * Martin Oberhuber (Wind River) - [225792] Rename SshConnector.getTelnetSettings() to getSshSettings() + * Martin Oberhuber (Wind River) - [225853][api] Provide more default functionality in TerminalConnectorImpl *******************************************************************************/ package org.eclipse.tm.internal.terminal.ssh; @@ -19,7 +20,6 @@ import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage; import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; import org.eclipse.tm.internal.terminal.provisional.api.Logger; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; import org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl; import com.jcraft.jsch.ChannelShell; @@ -28,7 +28,6 @@ import com.jcraft.jsch.JSch; public class SshConnector extends TerminalConnectorImpl { private OutputStream fOutputStream; private InputStream fInputStream; - private ITerminalControl fControl; private JSch fJsch; private ChannelShell fChannel; private SshConnection fConnection; @@ -45,13 +44,11 @@ public class SshConnector extends TerminalConnectorImpl { fJsch=new JSch(); } public void connect(ITerminalControl control) { - Logger.log("entered."); //$NON-NLS-1$ - fControl=control; + super.connect(control); fConnection = new SshConnection(this,control); fConnection.start(); } - synchronized public void disconnect() { - Logger.log("entered."); //$NON-NLS-1$ + synchronized public void doDisconnect() { fConnection.disconnect(); if (getInputStream() != null) { try { @@ -61,17 +58,13 @@ public class SshConnector extends TerminalConnectorImpl { } } - if (getOutputStream() != null) { + if (getTerminalToRemoteStream() != null) { try { - getOutputStream().close(); + getTerminalToRemoteStream().close(); } catch (Exception exception) { Logger.logException(exception); } } - setState(TerminalState.CLOSED); - } - public boolean isLocalEcho() { - return false; } public void setTerminalSize(int newWidth, int newHeight) { if(fChannel!=null && (newWidth!=fWidth || newHeight!=fHeight)) { @@ -84,7 +77,7 @@ public class SshConnector extends TerminalConnectorImpl { public InputStream getInputStream() { return fInputStream; } - public OutputStream getOutputStream() { + public OutputStream getTerminalToRemoteStream() { return fOutputStream; } void setInputStream(InputStream inputStream) { @@ -93,10 +86,6 @@ public class SshConnector extends TerminalConnectorImpl { void setOutputStream(OutputStream outputStream) { fOutputStream = outputStream; } - public void setState(TerminalState state) { - fControl.setState(state); - - } /** * Return the SSH Settings. * @@ -114,7 +103,6 @@ public class SshConnector extends TerminalConnectorImpl { } public void load(ISettingsStore store) { fSettings.load(store); - } public void save(ISettingsStore store) { fSettings.save(store); diff --git a/org.eclipse.tm.terminal.telnet/src/org/eclipse/tm/internal/terminal/telnet/TelnetConnector.java b/org.eclipse.tm.terminal.telnet/src/org/eclipse/tm/internal/terminal/telnet/TelnetConnector.java index 0784cc1bb57..4600cd7eac5 100644 --- a/org.eclipse.tm.terminal.telnet/src/org/eclipse/tm/internal/terminal/telnet/TelnetConnector.java +++ b/org.eclipse.tm.terminal.telnet/src/org/eclipse/tm/internal/terminal/telnet/TelnetConnector.java @@ -11,8 +11,9 @@ * Helmut Haigermoser and Ted Williams. * * Contributors: - * Michael Scharf (Wind River) - extracted from TerminalControl + * Michael Scharf (Wind River) - extracted from TerminalControl * Martin Oberhuber (Wind River) - fixed copyright headers and beautified + * Martin Oberhuber (Wind River) - [225853][api] Provide more default functionality in TerminalConnectorImpl *******************************************************************************/ package org.eclipse.tm.internal.terminal.telnet; @@ -44,19 +45,14 @@ public class TelnetConnector extends TerminalConnectorImpl { public TelnetConnector(TelnetSettings settings) { fSettings=settings; } - public void initialize() throws Exception { - } public void connect(ITerminalControl control) { - Logger.log("entered."); //$NON-NLS-1$ - fControl=control; + super.connect(control); fWidth=-1; fHeight=-1; TelnetConnectWorker worker = new TelnetConnectWorker(this,control); worker.start(); } - public void disconnect() { - Logger.log("entered."); //$NON-NLS-1$ - + public void doDisconnect() { if (getSocket() != null) { try { getSocket().close(); @@ -64,7 +60,7 @@ public class TelnetConnector extends TerminalConnectorImpl { Logger.logException(exception); } } - + if (getInputStream() != null) { try { getInputStream().close(); @@ -72,16 +68,15 @@ public class TelnetConnector extends TerminalConnectorImpl { Logger.logException(exception); } } - - if (getOutputStream() != null) { + + if (getTerminalToRemoteStream() != null) { try { - getOutputStream().close(); + getTerminalToRemoteStream().close(); } catch (Exception exception) { Logger.logException(exception); } } cleanSocket(); - setState(TerminalState.CLOSED); } public boolean isLocalEcho() { if(fTelnetConnection!=null) @@ -99,7 +94,7 @@ public class TelnetConnector extends TerminalConnectorImpl { public InputStream getInputStream() { return fInputStream; } - public OutputStream getOutputStream() { + public OutputStream getTerminalToRemoteStream() { return fOutputStream; } private void setInputStream(InputStream inputStream) { @@ -111,7 +106,7 @@ public class TelnetConnector extends TerminalConnectorImpl { Socket getSocket() { return fSocket; } - + /** * sets the socket to null */ @@ -120,7 +115,7 @@ public class TelnetConnector extends TerminalConnectorImpl { setInputStream(null); setOutputStream(null); } - + void setSocket(Socket socket) throws IOException { if(socket==null) { cleanSocket(); @@ -132,18 +127,16 @@ public class TelnetConnector extends TerminalConnectorImpl { } public void setTelnetConnection(TelnetConnection connection) { - fTelnetConnection=connection; + fTelnetConnection=connection; } public void displayTextInTerminal(String text) { fControl.displayTextInTerminal(text); } public OutputStream getRemoteToTerminalOutputStream () { return fControl.getRemoteToTerminalOutputStream(); - } public void setState(TerminalState state) { fControl.setState(state); - } public ITelnetSettings getTelnetSettings() { return fSettings; @@ -156,7 +149,6 @@ public class TelnetConnector extends TerminalConnectorImpl { } public void load(ISettingsStore store) { fSettings.load(store); - } public void save(ISettingsStore store) { fSettings.save(store); diff --git a/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/connector/TerminalConnectorTest.java b/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/connector/TerminalConnectorTest.java index 7dca356a5fb..c3e23849272 100644 --- a/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/connector/TerminalConnectorTest.java +++ b/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/connector/TerminalConnectorTest.java @@ -1,12 +1,13 @@ /******************************************************************************* * Copyright (c) 2007, 2008 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: * Michael Scharf (Wind River) - initial API and implementation + * Martin Oberhuber (Wind River) - [225853][api] Provide more default functionality in TerminalConnectorImpl *******************************************************************************/ package org.eclipse.tm.internal.terminal.connector; @@ -36,7 +37,7 @@ public class TerminalConnectorTest extends TestCase { public void put(String key, String value) { } - + } public static class TerminalControlMock implements ITerminalControl { @@ -83,13 +84,14 @@ public class TerminalConnectorTest extends TestCase { fHeight=newHeight; } public void connect(ITerminalControl control) { - fControl=control; + super.connect(control); + fControl = control; } - public void disconnect() { + public void doDisconnect() { fDisconnect=true; } - public OutputStream getOutputStream() { + public OutputStream getTerminalToRemoteStream() { return null; } @@ -126,7 +128,7 @@ public class TerminalConnectorTest extends TestCase { public TerminalConnectorImpl makeConnector() throws Exception { // TODO Auto-generated method stub return fConnector; - } + } } public void testGetInitializationErrorMessage() { TerminalConnector c=new TerminalConnector(new SimpleFactory(new ConnectorMock()),"xID","xName"); @@ -139,7 +141,7 @@ public class TerminalConnectorTest extends TestCase { }}),"xID","xName"); c.connect(new TerminalControlMock()); assertEquals("FAILED",c.getInitializationErrorMessage()); - + } public void testGetIdAndName() { @@ -172,7 +174,7 @@ public class TerminalConnectorTest extends TestCase { assertFalse(c.isInitialized()); c.connect(new TerminalControlMock()); assertTrue(c.isInitialized()); - + } public void testDisconnect() { @@ -226,7 +228,7 @@ public class TerminalConnectorTest extends TestCase { assertNull(mock.fSaveStore); c.connect(new TerminalControlMock()); c.save(s); - assertSame(s,mock.fSaveStore); + assertSame(s,mock.fSaveStore); } public void testMakeSettingsPage() { @@ -239,7 +241,7 @@ public class TerminalConnectorTest extends TestCase { ConnectorMock mock=new ConnectorMock(); TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName"); c.setTerminalSize(100, 200); - + } public void testGetAdapter() { diff --git a/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/speedtest/SpeedTestConnector.java b/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/speedtest/SpeedTestConnector.java index c3ce00c35c0..88e9b5a5d13 100644 --- a/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/speedtest/SpeedTestConnector.java +++ b/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/speedtest/SpeedTestConnector.java @@ -1,12 +1,13 @@ /******************************************************************************* * Copyright (c) 2007, 2008 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: * Michael Scharf (Wind River) - initial API and implementation + * Martin Oberhuber (Wind River) - [225853][api] Provide more default functionality in TerminalConnectorImpl *******************************************************************************/ package org.eclipse.tm.internal.terminal.speedtest; @@ -27,12 +28,11 @@ public class SpeedTestConnector extends TerminalConnectorImpl { final SpeedTestSettings fSettings=new SpeedTestSettings(); InputStream fInputStream; OutputStream fOutputStream; - ITerminalControl fControl; SpeedTestConnection fConnection; public SpeedTestConnector() { } synchronized public void connect(ITerminalControl control) { - fControl=control; + super.connect(control); fControl.setState(TerminalState.CONNECTING); String file=fSettings.getInputFile(); try { @@ -48,7 +48,7 @@ public class SpeedTestConnector extends TerminalConnectorImpl { fConnection.start(); } - synchronized public void disconnect() { + synchronized public void doDisconnect() { if(fConnection!=null){ fConnection.interrupt(); fConnection=null; @@ -69,13 +69,12 @@ public class SpeedTestConnector extends TerminalConnectorImpl { } } fOutputStream=null; - fControl.setState(TerminalState.CLOSED); } synchronized public InputStream getInputStream() { return fInputStream; } - synchronized public OutputStream getOutputStream() { + synchronized public OutputStream getTerminalToRemoteStream() { return fOutputStream; } @@ -87,13 +86,8 @@ public class SpeedTestConnector extends TerminalConnectorImpl { //throw new RuntimeException("XXX problems\nSpeedTest\nXXX!"); } - public boolean isLocalEcho() { - return false; - } - public void load(ISettingsStore store) { fSettings.load(store); - } public ISettingsPage makeSettingsPage() { @@ -102,7 +96,6 @@ public class SpeedTestConnector extends TerminalConnectorImpl { public void save(ISettingsStore store) { fSettings.save(store); - } public void setTerminalSize(int newWidth, int newHeight) { diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/connector/TerminalConnector.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/connector/TerminalConnector.java index 091b549bbc8..b2439f6c204 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/connector/TerminalConnector.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/connector/TerminalConnector.java @@ -8,6 +8,7 @@ * Contributors: * Michael Scharf (Wind River) - initial API and implementation * Michael Scharf (Wind River) - [200541] Extract from TerminalConnectorExtension.TerminalConnectorProxy + * Martin Oberhuber (Wind River) - [225853][api] Provide more default functionality in TerminalConnectorImpl *******************************************************************************/ package org.eclipse.tm.internal.terminal.connector; @@ -123,23 +124,15 @@ public class TerminalConnector implements ITerminalConnector { fException=e; fConnector=new TerminalConnectorImpl(){ public void connect(ITerminalControl control) { + // super.connect(control); control.setState(TerminalState.CLOSED); control.setMsg(getInitializationErrorMessage()); } - public void disconnect() { - } - public OutputStream getOutputStream() { + public OutputStream getTerminalToRemoteStream() { return null; } public String getSettingsSummary() { return null; - } - public void load(ISettingsStore store) { - } - public ISettingsPage makeSettingsPage() { - return null; - } - public void save(ISettingsStore store) { }}; // that's the place where we log the exception Logger.logException(e); @@ -160,7 +153,7 @@ public class TerminalConnector implements ITerminalConnector { getConnectorImpl().disconnect(); } public OutputStream getTerminalToRemoteStream() { - return getConnectorImpl().getOutputStream(); + return getConnectorImpl().getTerminalToRemoteStream(); } public String getSettingsSummary() { if(fConnector!=null) diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/provider/TerminalConnectorImpl.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/provider/TerminalConnectorImpl.java index 50359d45733..27e5557339d 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/provider/TerminalConnectorImpl.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/provider/TerminalConnectorImpl.java @@ -7,6 +7,7 @@ * * Contributors: * Michael Scharf (Wind River) - initial API and implementation + * Martin Oberhuber (Wind River) - [225853][api] Provide more default functionality in TerminalConnectorImpl *******************************************************************************/ package org.eclipse.tm.internal.terminal.provisional.api.provider; @@ -15,6 +16,8 @@ import java.io.OutputStream; import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage; import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; +import org.eclipse.tm.internal.terminal.provisional.api.Logger; +import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; /** * Abstract base class for all terminal connector implementations to be @@ -25,6 +28,12 @@ import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; */ public abstract class TerminalConnectorImpl { + /** + * The TerminalControl associated with this connector. + * Required for advertising state changes when needed. + */ + protected ITerminalControl fControl; + /** * Initialize this connector. This is called once after the constructor, in * order to perform any required initializations such as loading required @@ -39,22 +48,44 @@ public abstract class TerminalConnectorImpl { /** * Connect using the current state of the settings. - * @param control Used to inform the UI about state changes and messages from the connection. + * + * This method is designed to be overridden by actual implementations, in + * order to open the streams required for communicating with the remote + * side. Extenders must call super.connect(control) as the + * first thing they are doing. + * + * @param control Used to inform the UI about state changes and messages + * from the connection. */ - abstract public void connect(ITerminalControl control); + public void connect(ITerminalControl control) { + Logger.log("entered."); //$NON-NLS-1$ + fControl = control; + } /** - * Disconnect if connected. Else do nothing. - * Has to set the state of the {@link ITerminalControl} + * Disconnect if connected. Else do nothing. Has to set the state of the + * {@link ITerminalControl} when finished disconnecting. */ - abstract public void disconnect(); + public final void disconnect() { + Logger.log("entered."); //$NON-NLS-1$ + doDisconnect(); + fControl.setState(TerminalState.CLOSED); + } + + /** + * Disconnect if connected. Else do nothing. Clients should override to + * perform any extra work needed for disconnecting. + */ + protected void doDisconnect() { + // Do nothing by default + } /** * @return the terminal to remote stream (bytes written to this stream will * be sent to the remote site). For the stream in the other direction (remote to * terminal see {@link ITerminalControl#getRemoteToTerminalOutputStream()} */ - abstract public OutputStream getOutputStream(); + abstract public OutputStream getTerminalToRemoteStream(); /** * @return A string that represents the settings of the connection. This representation @@ -63,41 +94,65 @@ public abstract class TerminalConnectorImpl { abstract public String getSettingsSummary(); /** - * @return true if a local echo is needed. - * TODO:Michael Scharf: this should be handed within the connection.... + * Test if local echo is needed. The default implementation returns + * false. Override to modify this behavior. + * + * @return true if a local echo is needed. TODO:Michael Scharf: this should + * be handed within the connection.... */ public boolean isLocalEcho() { return false; } /** - * @return a new page that can be used in a dialog to setup this connection. - * The dialog should persist its settings with the {@link #load(ISettingsStore)} - * and {@link #save(ISettingsStore)} methods. + * Return a settings page for configuring this connector, or + * null if it cannot be configured. * + * The dialog should persist its settings with the + * {@link #load(ISettingsStore)} and {@link #save(ISettingsStore)} methods. + * + * @return a new page that can be used in a dialog to setup this connection, + * or null. */ - abstract public ISettingsPage makeSettingsPage(); + public ISettingsPage makeSettingsPage() { + return null; + } /** - * Load the state of this connection. Is typically called before + * Load the state or settings of this connection. Is typically called before * {@link #connect(ITerminalControl)}. * - * @param store a string based data store. Short keys like "foo" can be used to - * store the state of the connection. + * Connectors that have nothing to configure do not need to implement this. + * Those terminals that do have configuration (which they expose via + * {@link #makeSettingsPage()} need to override this method to load + * settings. + * + * @param store a string based data store. Short keys like "foo" can be used + * to store the state of the connection. */ - abstract public void load(ISettingsStore store); + public void load(ISettingsStore store) { + // do nothing by default + } /** * When the view or dialog containing the terminal is closed, the state of - * the connection is saved into the settings store store + * the connection is saved into the settings store store. + * + * Connectors that have no state or settings to persist do not need to + * override this. Others should override to persist their settings. * * @param store the store for persisting settings. */ - abstract public void save(ISettingsStore store); + public void save(ISettingsStore store) { + // do nothing by default + } /** * Notify the remote site that the size of the terminal has changed. * + * Concrete connectors should override this if they have the possibility to + * inform the remote about changed terminal size. + * * @param newWidth the new width in characters. * @param newHeight the new height in characters. */