1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-14 12:35:22 +02:00

bug 200541: [terminal][api] TerminalConnectorProxy class should be removed

https://bugs.eclipse.org/bugs/show_bug.cgi?id=200541
The attached patch contains the following changes:
- ITerminalConnectorInfo is gone
- ITerminalConnector is now the client interface
- the implmentation is in org.eclipse.tm.internal.terminal.connector.TerminalConnector
  (was TerminalConnectorExtension.TerminalConnectorProxy)
- TerminalConnector is adaptable and can be adapted to the TerminalConnectorImpl
- the terminalConnector extension now requires extensions to implement TerminalConnectorImpl
  (was ITerminalConnector before)
- a test added for TerminalConnector
This commit is contained in:
Michael Scharf 2008-04-04 13:52:27 +00:00
parent bb8d4a18c5
commit c91dfb4717
24 changed files with 690 additions and 308 deletions

View file

@ -30,12 +30,12 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage; 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.ISettingsStore;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; 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.Logger;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalConnectorImpl;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
public class SerialConnector implements ITerminalConnector { public class SerialConnector extends TerminalConnectorImpl {
private OutputStream fOutputStream; private OutputStream fOutputStream;
private InputStream fInputStream; private InputStream fInputStream;
private ITerminalControl fControl; private ITerminalControl fControl;

View file

@ -16,15 +16,15 @@ import java.io.OutputStream;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage; 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.ISettingsStore;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; 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.Logger;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalConnectorImpl;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
import com.jcraft.jsch.ChannelShell; import com.jcraft.jsch.ChannelShell;
import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSch;
public class SshConnector implements ITerminalConnector { public class SshConnector extends TerminalConnectorImpl {
private OutputStream fOutputStream; private OutputStream fOutputStream;
private InputStream fInputStream; private InputStream fInputStream;
private ITerminalControl fControl; private ITerminalControl fControl;

View file

@ -23,12 +23,12 @@ import java.net.Socket;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage; 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.ISettingsStore;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; 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.Logger;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalConnectorImpl;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
public class TelnetConnector implements ITerminalConnector { public class TelnetConnector extends TerminalConnectorImpl {
private OutputStream fOutputStream; private OutputStream fOutputStream;
private InputStream fInputStream; private InputStream fInputStream;
private Socket fSocket; private Socket fSocket;

View file

@ -8,7 +8,8 @@ Bundle-Localization: plugin
Require-Bundle: org.junit, Require-Bundle: org.junit,
org.eclipse.tm.terminal, org.eclipse.tm.terminal,
org.eclipse.swt, org.eclipse.swt,
org.eclipse.jface org.eclipse.jface,
org.eclipse.core.runtime
Bundle-RequiredExecutionEnvironment: J2SE-1.4 Bundle-RequiredExecutionEnvironment: J2SE-1.4
Export-Package: org.eclipse.tm.internal.terminal.emulator;x-internal:=true, Export-Package: org.eclipse.tm.internal.terminal.emulator;x-internal:=true,
org.eclipse.tm.internal.terminal.model;x-internal:=true, org.eclipse.tm.internal.terminal.model;x-internal:=true,

View file

@ -0,0 +1,255 @@
/*******************************************************************************
* Copyright (c) 2007 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:
* Michael Scharf (Wind River) - initial API and implementation
*******************************************************************************/
package org.eclipse.tm.internal.terminal.connector;
import java.io.OutputStream;
import junit.framework.TestCase;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.tm.internal.terminal.connector.TerminalConnector.Factory;
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.TerminalConnectorImpl;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
public class TerminalConnectorTest extends TestCase {
public class SettingsMock implements ISettingsStore {
public String get(String key) {
return null;
}
public String get(String key, String defaultValue) {
return null;
}
public void put(String key, String value) {
}
}
public static class TerminalControlMock implements ITerminalControl {
public void displayTextInTerminal(String text) {
}
public OutputStream getRemoteToTerminalOutputStream() {
return null;
}
public Shell getShell() {
return null;
}
public TerminalState getState() {
return null;
}
public void setMsg(String msg) {
}
public void setState(TerminalState state) {
}
public void setTerminalTitle(String title) {
}
}
static class ConnectorMock extends TerminalConnectorImpl {
public boolean fEcho;
public int fWidth;
public int fHeight;
public ITerminalControl fControl;
public ISettingsStore fSaveStore;
public ISettingsStore fLoadStore;
public boolean fDisconnect;
public boolean isLocalEcho() {
return fEcho;
}
public void setTerminalSize(int newWidth, int newHeight) {
fWidth=newWidth;
fHeight=newHeight;
}
public void connect(ITerminalControl control) {
fControl=control;
}
public void disconnect() {
fDisconnect=true;
}
public OutputStream getOutputStream() {
return null;
}
public String getSettingsSummary() {
return "Summary";
}
public void load(ISettingsStore store) {
fLoadStore=store;
}
public ISettingsPage makeSettingsPage() {
return new ISettingsPage(){
public void createControl(Composite parent) {
}
public void loadSettings() {
}
public void saveSettings() {
}
public boolean validateSettings() {
return false;
}};
}
public void save(ISettingsStore store) {
fSaveStore=store;
}
}
static class SimpleFactory implements Factory {
final TerminalConnectorImpl fConnector;
public SimpleFactory(TerminalConnectorImpl connector) {
fConnector = connector;
}
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");
c.connect(new TerminalControlMock());
assertNull(c.getInitializationErrorMessage());
c=new TerminalConnector(new SimpleFactory(new ConnectorMock(){
public void initialize() throws Exception {
throw new Exception("FAILED");
}}),"xID","xName");
c.connect(new TerminalControlMock());
assertEquals("FAILED",c.getInitializationErrorMessage());
}
public void testGetIdAndName() {
TerminalConnector c=new TerminalConnector(new SimpleFactory(new ConnectorMock()),"xID","xName");
assertEquals("xID", c.getId());
assertEquals("xName", c.getName());
}
public void testIsInitialized() {
TerminalConnector c=new TerminalConnector(new SimpleFactory(new ConnectorMock()),"xID","xName");
assertFalse(c.isInitialized());
c.getId();
assertFalse(c.isInitialized());
c.getName();
assertFalse(c.isInitialized());
c.getSettingsSummary();
assertFalse(c.isInitialized());
c.setTerminalSize(10,10);
assertFalse(c.isInitialized());
c.load(null);
assertFalse(c.isInitialized());
c.save(null);
assertFalse(c.isInitialized());
c.getAdapter(ConnectorMock.class);
assertFalse(c.isInitialized());
}
public void testConnect() {
TerminalConnector c=new TerminalConnector(new SimpleFactory(new ConnectorMock()),"xID","xName");
assertFalse(c.isInitialized());
c.connect(new TerminalControlMock());
assertTrue(c.isInitialized());
}
public void testDisconnect() {
ConnectorMock mock=new ConnectorMock();
TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName");
TerminalControlMock control=new TerminalControlMock();
c.connect(control);
c.disconnect();
assertTrue(mock.fDisconnect);
}
public void testGetTerminalToRemoteStream() {
ConnectorMock mock=new ConnectorMock();
TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName");
TerminalControlMock control=new TerminalControlMock();
c.connect(control);
assertSame(mock.fControl,control);
}
public void testGetSettingsSummary() {
TerminalConnector c=new TerminalConnector(new SimpleFactory(new ConnectorMock()),"xID","xName");
assertEquals("Not Initialized", c.getSettingsSummary());
c.connect(new TerminalControlMock());
assertEquals("Summary", c.getSettingsSummary());
}
public void testIsLocalEcho() {
ConnectorMock mock=new ConnectorMock();
TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName");
assertFalse(c.isLocalEcho());
mock.fEcho=true;
assertTrue(c.isLocalEcho());
}
public void testLoad() {
ConnectorMock mock=new ConnectorMock();
TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName");
ISettingsStore s=new SettingsMock();
c.load(s);
// the load is called after the connect...
assertNull(mock.fLoadStore);
c.connect(new TerminalControlMock());
assertSame(s,mock.fLoadStore);
}
public void testSave() {
ConnectorMock mock=new ConnectorMock();
TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName");
ISettingsStore s=new SettingsMock();
c.save(s);
assertNull(mock.fSaveStore);
c.connect(new TerminalControlMock());
c.save(s);
assertSame(s,mock.fSaveStore);
}
public void testMakeSettingsPage() {
ConnectorMock mock=new ConnectorMock();
TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName");
assertNotNull(c.makeSettingsPage());
}
public void testSetTerminalSize() {
ConnectorMock mock=new ConnectorMock();
TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName");
c.setTerminalSize(100, 200);
}
public void testGetAdapter() {
ConnectorMock mock=new ConnectorMock();
TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName");
assertNull(c.getAdapter(ConnectorMock.class));
// the load is called after the connect...
c.connect(new TerminalControlMock());
assertSame(mock, c.getAdapter(ConnectorMock.class));
}
}

View file

@ -18,12 +18,12 @@ import java.io.OutputStream;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage; 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.ISettingsStore;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; 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.Logger;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalConnectorImpl;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
public class SpeedTestConnector implements ITerminalConnector { public class SpeedTestConnector extends TerminalConnectorImpl {
final SpeedTestSettings fSettings=new SpeedTestSettings(); final SpeedTestSettings fSettings=new SpeedTestSettings();
InputStream fInputStream; InputStream fInputStream;
OutputStream fOutputStream; OutputStream fOutputStream;

View file

@ -19,7 +19,7 @@ import java.io.OutputStream;
import org.eclipse.tm.internal.terminal.control.impl.ITerminalControlForText; import org.eclipse.tm.internal.terminal.control.impl.ITerminalControlForText;
import org.eclipse.tm.internal.terminal.emulator.VT100Emulator; import org.eclipse.tm.internal.terminal.emulator.VT100Emulator;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnectorInfo; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
import org.eclipse.tm.terminal.model.ITerminalTextData; import org.eclipse.tm.terminal.model.ITerminalTextData;
@ -89,7 +89,7 @@ final class VT100DataSource implements IDataSource {
return TerminalState.CONNECTED; return TerminalState.CONNECTED;
} }
public ITerminalConnectorInfo getTerminalConnectorInfo() { public ITerminalConnector getTerminalConnector() {
return null; return null;
} }

View file

@ -41,12 +41,12 @@ import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Text;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage; import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnectorInfo; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
class TerminalSettingsDlg extends Dialog { class TerminalSettingsDlg extends Dialog {
private Combo fCtlConnTypeCombo; private Combo fCtlConnTypeCombo;
private Text fTerminalTitleText; private Text fTerminalTitleText;
private final ITerminalConnectorInfo[] fConnectors; private final ITerminalConnector[] fConnectors;
private final ISettingsPage[] fPages; private final ISettingsPage[] fPages;
/** /**
* Maps the fConnectors index to the fPages index * Maps the fConnectors index to the fPages index
@ -58,7 +58,7 @@ class TerminalSettingsDlg extends Dialog {
private IDialogSettings fDialogSettings; private IDialogSettings fDialogSettings;
private String fTerminalTitle; private String fTerminalTitle;
public TerminalSettingsDlg(Shell shell, ITerminalConnectorInfo[] connectors, ITerminalConnectorInfo connector) { public TerminalSettingsDlg(Shell shell, ITerminalConnector[] connectors, ITerminalConnector connector) {
super(shell); super(shell);
fConnectors=getValidConnectors(connectors); fConnectors=getValidConnectors(connectors);
fPages=new ISettingsPage[fConnectors.length]; fPages=new ISettingsPage[fConnectors.length];
@ -73,21 +73,21 @@ class TerminalSettingsDlg extends Dialog {
* @param connectors * @param connectors
* @return connectors excluding connectors with errors * @return connectors excluding connectors with errors
*/ */
private ITerminalConnectorInfo[] getValidConnectors(ITerminalConnectorInfo[] connectors) { private ITerminalConnector[] getValidConnectors(ITerminalConnector[] connectors) {
List list=new ArrayList(Arrays.asList(connectors)); List list=new ArrayList(Arrays.asList(connectors));
for (Iterator iterator = list.iterator(); iterator.hasNext();) { for (Iterator iterator = list.iterator(); iterator.hasNext();) {
ITerminalConnectorInfo info = (ITerminalConnectorInfo) iterator.next(); ITerminalConnector info = (ITerminalConnector) iterator.next();
if(info.isInitialized() && info.getInitializationErrorMessage()!=null) if(info.isInitialized() && info.getInitializationErrorMessage()!=null)
iterator.remove(); iterator.remove();
} }
connectors=(ITerminalConnectorInfo[]) list.toArray(new ITerminalConnectorInfo[list.size()]); connectors=(ITerminalConnector[]) list.toArray(new ITerminalConnector[list.size()]);
return connectors; return connectors;
} }
ISettingsPage getPage(int i) { ISettingsPage getPage(int i) {
if(fPages[i]==null) { if(fPages[i]==null) {
if(fConnectors[i].getInitializationErrorMessage()!=null) { if(fConnectors[i].getInitializationErrorMessage()!=null) {
// create a error message // create a error message
final ITerminalConnectorInfo conn=fConnectors[i]; final ITerminalConnector conn=fConnectors[i];
fPages[i]=new ISettingsPage(){ fPages[i]=new ISettingsPage(){
public void createControl(Composite parent) { public void createControl(Composite parent) {
Label l=new Label(parent,SWT.WRAP); Label l=new Label(parent,SWT.WRAP);
@ -105,7 +105,7 @@ class TerminalSettingsDlg extends Dialog {
public boolean validateSettings() {return false;} public boolean validateSettings() {return false;}
}; };
} else { } else {
fPages[i]=fConnectors[i].getConnector().makeSettingsPage(); fPages[i]=fConnectors[i].makeSettingsPage();
} }
// TODO: what happens if an error occurs while // TODO: what happens if an error occurs while
// the control is partly created? // the control is partly created?
@ -245,7 +245,7 @@ class TerminalSettingsDlg extends Dialog {
} }
}); });
} }
public ITerminalConnectorInfo getConnector() { public ITerminalConnector getConnector() {
if(fSelectedConnector>=0) if(fSelectedConnector>=0)
return fConnectors[fSelectedConnector]; return fConnectors[fSelectedConnector];
return null; return null;

View file

@ -56,7 +56,7 @@ import org.eclipse.tm.internal.terminal.control.ITerminalListener;
import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; import org.eclipse.tm.internal.terminal.control.ITerminalViewControl;
import org.eclipse.tm.internal.terminal.control.TerminalViewControlFactory; import org.eclipse.tm.internal.terminal.control.TerminalViewControlFactory;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnectorInfo; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.Logger; import org.eclipse.tm.internal.terminal.provisional.api.Logger;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalConnectorExtension; import org.eclipse.tm.internal.terminal.provisional.api.TerminalConnectorExtension;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
@ -211,7 +211,7 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi
//if (isConnected()) //if (isConnected())
if (fCtlTerminal.getState()!=TerminalState.CLOSED) if (fCtlTerminal.getState()!=TerminalState.CLOSED)
return; return;
if(fCtlTerminal.getTerminalConnectorInfo()==null) if(fCtlTerminal.getTerminalConnector()==null)
setConnector(showSettingsDialog()); setConnector(showSettingsDialog());
fCtlTerminal.connectTerminal(); fCtlTerminal.connectTerminal();
} }
@ -246,7 +246,7 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi
} }
public void onTerminalSettings() { public void onTerminalSettings() {
ITerminalConnectorInfo c=showSettingsDialog(); ITerminalConnector c=showSettingsDialog();
if(c!=null) { if(c!=null) {
setConnector(c); setConnector(c);
@ -254,11 +254,11 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi
} }
} }
private ITerminalConnectorInfo showSettingsDialog() { private ITerminalConnector showSettingsDialog() {
// When the settings dialog is opened, load the Terminal settings from the // When the settings dialog is opened, load the Terminal settings from the
// persistent settings. // persistent settings.
TerminalSettingsDlg dlgTerminalSettings = new TerminalSettingsDlg(getViewSite().getShell(),fCtlTerminal.getConnectors(),fCtlTerminal.getTerminalConnectorInfo()); TerminalSettingsDlg dlgTerminalSettings = new TerminalSettingsDlg(getViewSite().getShell(),fCtlTerminal.getConnectors(),fCtlTerminal.getTerminalConnector());
dlgTerminalSettings.setTerminalTitle(getPartName()); dlgTerminalSettings.setTerminalTitle(getPartName());
Logger.log("opening Settings dialog."); //$NON-NLS-1$ Logger.log("opening Settings dialog."); //$NON-NLS-1$
@ -276,7 +276,7 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi
return dlgTerminalSettings.getConnector(); return dlgTerminalSettings.getConnector();
} }
private void setConnector(ITerminalConnectorInfo connector) { private void setConnector(ITerminalConnector connector) {
fCtlTerminal.setConnector(connector); fCtlTerminal.setConnector(connector);
} }
@ -296,7 +296,7 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi
// display in the view's content description line. This is used by class // display in the view's content description line. This is used by class
// TerminalText when it processes an ANSI OSC escape sequence that commands // TerminalText when it processes an ANSI OSC escape sequence that commands
// the terminal to display text in its title bar. // the terminal to display text in its title bar.
} else if(fCtlTerminal.getTerminalConnectorInfo()==null){ } else if(fCtlTerminal.getTerminalConnector()==null){
strTitle=ViewMessages.NO_CONNECTION_SELECTED; strTitle=ViewMessages.NO_CONNECTION_SELECTED;
} else { } else {
// When parameter 'data' is null, we construct a descriptive string to // When parameter 'data' is null, we construct a descriptive string to
@ -307,7 +307,7 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi
//In order to make the logic of assembling, and the separators, better adapt to foreign languages //In order to make the logic of assembling, and the separators, better adapt to foreign languages
if(summary.length()>0) if(summary.length()>0)
summary=summary+" - "; //$NON-NLS-1$ summary=summary+" - "; //$NON-NLS-1$
String name=fCtlTerminal.getTerminalConnectorInfo().getName(); String name=fCtlTerminal.getTerminalConnector().getName();
if(name.length()>0) { if(name.length()>0) {
name+=": "; //$NON-NLS-1$ name+=": "; //$NON-NLS-1$
} }
@ -327,7 +327,7 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi
// TODO: use another mechanism than "?" for the magic non initialized state // TODO: use another mechanism than "?" for the magic non initialized state
// see TerminalConnectorProxy.getSettingsSummary // see TerminalConnectorProxy.getSettingsSummary
String summary="?"; //$NON-NLS-1$ String summary="?"; //$NON-NLS-1$
if(fCtlTerminal.getTerminalConnectorInfo()!=null) if(fCtlTerminal.getTerminalConnector()!=null)
summary=fCtlTerminal.getSettingsSummary(); summary=fCtlTerminal.getSettingsSummary();
if("?".equals(summary)) { //$NON-NLS-1$ if("?".equals(summary)) { //$NON-NLS-1$
summary=fStore.get(STORE_SETTING_SUMMARY, ""); //$NON-NLS-1$ summary=fStore.get(STORE_SETTING_SUMMARY, ""); //$NON-NLS-1$
@ -451,11 +451,11 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi
* This method creates the top-level control for the Terminal view. * This method creates the top-level control for the Terminal view.
*/ */
protected void setupControls(Composite wndParent) { protected void setupControls(Composite wndParent) {
ITerminalConnectorInfo[] connectors=TerminalConnectorExtension.getTerminalConnectors(); ITerminalConnector[] connectors = makeConnectors();
fCtlTerminal = TerminalViewControlFactory.makeControl(this, wndParent, connectors); fCtlTerminal = TerminalViewControlFactory.makeControl(this, wndParent, connectors);
String connectionType=fStore.get(STORE_CONNECTION_TYPE); String connectionType=fStore.get(STORE_CONNECTION_TYPE);
for (int i = 0; i < connectors.length; i++) { for (int i = 0; i < connectors.length; i++) {
connectors[i].getConnector().load(getStore(connectors[i])); connectors[i].load(getStore(connectors[i]));
if(connectors[i].getId().equals(connectionType)) if(connectors[i].getId().equals(connectionType))
fCtlTerminal.setConnector(connectors[i]); fCtlTerminal.setConnector(connectors[i]);
} }
@ -469,10 +469,18 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi
setPartName(title); setPartName(title);
} }
private void saveSettings(ITerminalConnectorInfo connector) { /**
ITerminalConnectorInfo[] connectors=fCtlTerminal.getConnectors(); * @return a list of connectors this view can use
*/
protected ITerminalConnector[] makeConnectors() {
ITerminalConnector[] connectors=TerminalConnectorExtension.makeTerminalConnectors();
return connectors;
}
private void saveSettings(ITerminalConnector connector) {
ITerminalConnector[] connectors=fCtlTerminal.getConnectors();
for (int i = 0; i < connectors.length; i++) { for (int i = 0; i < connectors.length; i++) {
connectors[i].getConnector().save(getStore(connectors[i])); connectors[i].save(getStore(connectors[i]));
} }
if(connector!=null) { if(connector!=null) {
fStore.put(STORE_CONNECTION_TYPE,connector.getId()); fStore.put(STORE_CONNECTION_TYPE,connector.getId());
@ -493,7 +501,7 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi
fStore.put(STORE_TITLE,getPartName()); fStore.put(STORE_TITLE,getPartName());
fStore.saveState(memento); fStore.saveState(memento);
} }
private ISettingsStore getStore(ITerminalConnectorInfo connector) { private ISettingsStore getStore(ITerminalConnector connector) {
return new SettingStorePrefixDecorator(fStore,connector.getId()+"."); //$NON-NLS-1$ return new SettingStorePrefixDecorator(fStore,connector.getId()+"."); //$NON-NLS-1$
} }

View file

@ -12,10 +12,16 @@ Bundle-ActivationPolicy: lazy
Eclipse-LazyStart: true Eclipse-LazyStart: true
Bundle-RequiredExecutionEnvironment: J2SE-1.4 Bundle-RequiredExecutionEnvironment: J2SE-1.4
Bundle-ClassPath: . Bundle-ClassPath: .
Export-Package: org.eclipse.tm.internal.terminal.control;x-friends:="org.eclipse.tm.terminal.view", Export-Package: org.eclipse.tm.internal.terminal.connector;x-friends:="org.eclipse.tm.terminal.test",
org.eclipse.tm.internal.terminal.control;x-friends:="org.eclipse.tm.terminal.view",
org.eclipse.tm.internal.terminal.control.impl;x-friends:="org.eclipse.tm.terminal.test", org.eclipse.tm.internal.terminal.control.impl;x-friends:="org.eclipse.tm.terminal.test",
org.eclipse.tm.internal.terminal.emulator;x-friends:="org.eclipse.tm.terminal.test", org.eclipse.tm.internal.terminal.emulator;x-friends:="org.eclipse.tm.terminal.test",
org.eclipse.tm.internal.terminal.model;x-friends:="org.eclipse.tm.terminal.test", org.eclipse.tm.internal.terminal.model;x-friends:="org.eclipse.tm.terminal.test",
org.eclipse.tm.internal.terminal.provisional.api;x-friends:="org.eclipse.tm.terminal.serial,org.eclipse.tm.terminal.ssh,org.eclipse.tm.terminal.telnet,org.eclipse.tm.terminal.view,org.eclipse.tm.terminal.test", org.eclipse.tm.internal.terminal.provisional.api;
x-friends:="org.eclipse.tm.terminal.serial,
org.eclipse.tm.terminal.ssh,
org.eclipse.tm.terminal.telnet,
org.eclipse.tm.terminal.view,
org.eclipse.tm.terminal.test",
org.eclipse.tm.internal.terminal.textcanvas;x-friends:="org.eclipse.tm.terminal.test", org.eclipse.tm.internal.terminal.textcanvas;x-friends:="org.eclipse.tm.terminal.test",
org.eclipse.tm.terminal.model org.eclipse.tm.terminal.model

View file

@ -2,9 +2,9 @@
<!-- Schema file written by PDE --> <!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.tm.terminal" xmlns="http://www.w3.org/2001/XMLSchema"> <schema targetNamespace="org.eclipse.tm.terminal" xmlns="http://www.w3.org/2001/XMLSchema">
<annotation> <annotation>
<appInfo> <appinfo>
<meta.schema plugin="org.eclipse.tm.terminal" id="terminalConnector" name="TerminalConnector"/> <meta.schema plugin="org.eclipse.tm.terminal" id="terminalConnector" name="TerminalConnector"/>
</appInfo> </appinfo>
<documentation> <documentation>
</documentation> </documentation>
@ -34,9 +34,9 @@
<documentation> <documentation>
</documentation> </documentation>
<appInfo> <appinfo>
<meta.attribute translatable="true"/> <meta.attribute translatable="true"/>
</appInfo> </appinfo>
</annotation> </annotation>
</attribute> </attribute>
</complexType> </complexType>
@ -49,9 +49,9 @@
<documentation> <documentation>
A class implementing ITerminalConnector A class implementing ITerminalConnector
</documentation> </documentation>
<appInfo> <appinfo>
<meta.attribute kind="java" basedOn="org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector"/> <meta.attribute kind="java" basedOn="org.eclipse.tm.internal.terminal.provisional.api.TerminalConnectorImpl:"/>
</appInfo> </appinfo>
</annotation> </annotation>
</attribute> </attribute>
<attribute name="id" type="string" use="required"> <attribute name="id" type="string" use="required">
@ -66,9 +66,9 @@
<documentation> <documentation>
The name of the connection (used in the UI) The name of the connection (used in the UI)
</documentation> </documentation>
<appInfo> <appinfo>
<meta.attribute translatable="true"/> <meta.attribute translatable="true"/>
</appInfo> </appinfo>
</annotation> </annotation>
</attribute> </attribute>
</complexType> </complexType>
@ -78,11 +78,10 @@
<annotation> <annotation>
<appInfo> <appinfo>
<meta.section type="copyright"/> <meta.section type="copyright"/>
</appInfo> </appinfo>
<documentation> <documentation>
Copyright (c) 2006 Wind River Systems, Inc. and others. Copyright (c) 2006 Wind River Systems, Inc. and others.
All rights reserved. This program and the accompanying materials All rights reserved. This program and the accompanying materials

View file

@ -0,0 +1,190 @@
package org.eclipse.tm.internal.terminal.connector;
import java.io.OutputStream;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.tm.internal.terminal.control.impl.TerminalMessages;
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.ITerminalConnector;
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.TerminalConnectorImpl;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
/**
* A placeholder for the ITerminalConnector. It gets initialized when
* the real connector is needed.
* The following methods can be called without initializing
* the contributed class: {@link #getId()}, {@link #getName()},
* {@link #getSettingsSummary()},{@link #load(ISettingsStore)},
* {@link #setTerminalSize(int, int)}, {@link #save(ISettingsStore)},
* {@link #getAdapter(Class)}
*
*/
public class TerminalConnector implements ITerminalConnector {
/**
* Creates an instance of TerminalConnectorImpl. This is
* used to lazily load classed defined in extensions.
*/
public interface Factory {
/**
* @return an Connector
* @throws Exception
*/
TerminalConnectorImpl makeConnector() throws Exception;
}
/**
*
*/
private final TerminalConnector.Factory fTerminalConnectorFactory;
/**
* The (display) name of the TerminalConnector
*/
private final String fName;
/**
* The unique id the connector
*/
private final String fId;
/**
* The connector
*/
private TerminalConnectorImpl fConnector;
/**
* If the initialization of the class specified in the extension fails,
* this variable contains the error
*/
private Exception fException;
/**
* The store might be set before the real connector is initialized.
* This keeps the value until the connector is created.
*/
private ISettingsStore fStore;
/**
* @param terminalConnectorFactory
* @param id
* @param name
*/
public TerminalConnector(TerminalConnector.Factory terminalConnectorFactory, String id, String name) {
fTerminalConnectorFactory = terminalConnectorFactory;
fId = id;
fName = name;
}
public String getInitializationErrorMessage() {
getConnectorImpl();
if(fException!=null)
return fException.getLocalizedMessage();
return null;
}
public String getId() {
return fId;
}
public String getName() {
return fName;
}
private TerminalConnectorImpl getConnectorImpl() {
if(!isInitialized()) {
try {
fConnector=fTerminalConnectorFactory.makeConnector();
fConnector.initialize();
} catch (Exception e) {
fException=e;
fConnector=new TerminalConnectorImpl(){
public void connect(ITerminalControl control) {
control.setState(TerminalState.CLOSED);
control.setMsg(getInitializationErrorMessage());
}
public void disconnect() {
}
public OutputStream getOutputStream() {
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);
}
if(fConnector!=null && fStore!=null)
fConnector.load(fStore);
}
return fConnector;
}
public boolean isInitialized() {
return fConnector!=null || fException!=null;
}
public void connect(ITerminalControl control) {
getConnectorImpl().connect(control);
}
public void disconnect() {
getConnectorImpl().disconnect();
}
public OutputStream getTerminalToRemoteStream() {
return getConnectorImpl().getOutputStream();
}
public String getSettingsSummary() {
if(fConnector!=null)
return getConnectorImpl().getSettingsSummary();
else
return TerminalMessages.NotInitialized;
}
public boolean isLocalEcho() {
return getConnectorImpl().isLocalEcho();
}
public void load(ISettingsStore store) {
if(fConnector==null) {
fStore=store;
} else {
getConnectorImpl().load(store);
}
}
public ISettingsPage makeSettingsPage() {
return getConnectorImpl().makeSettingsPage();
}
public void save(ISettingsStore store) {
// no need to save the settings: it cannot have changed
// because we are not initialized....
if(fConnector!=null)
getConnectorImpl().save(store);
}
public void setTerminalSize(int newWidth, int newHeight) {
// we assume that setTerminalSize is called also after
// the terminal has been initialized. Else we would have to cache
// the values....
if(fConnector!=null) {
fConnector.setTerminalSize(newWidth, newHeight);
}
}
public Object getAdapter(Class adapter) {
TerminalConnectorImpl connector=null;
if(isInitialized())
connector=getConnectorImpl();
// if we cannot create the connector then we cannot adapt...
if(connector!=null) {
// maybe the connector is adaptable
if(connector instanceof IAdaptable) {
Object result =((IAdaptable)connector).getAdapter(adapter);
// Not sure if the next block is needed....
if(result==null)
//defer to the platform
result= Platform.getAdapterManager().getAdapter(connector, adapter);
if(result!=null)
return result;
}
// maybe the real adapter is what we need....
if(adapter.isInstance(connector))
return connector;
}
// maybe we have to be adapted....
return Platform.getAdapterManager().getAdapter(this, adapter);
}
}

View file

@ -14,7 +14,7 @@ package org.eclipse.tm.internal.terminal.control;
import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Control;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnectorInfo; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
/** /**
@ -38,10 +38,10 @@ public interface ITerminalViewControl {
void disconnectTerminal(); void disconnectTerminal();
void disposeTerminal(); void disposeTerminal();
String getSettingsSummary(); String getSettingsSummary();
ITerminalConnectorInfo[] getConnectors(); ITerminalConnector[] getConnectors();
void setFocus(); void setFocus();
ITerminalConnectorInfo getTerminalConnectorInfo(); ITerminalConnector getTerminalConnector();
void setConnector(ITerminalConnectorInfo connector); void setConnector(ITerminalConnector connector);
void connectTerminal(); void connectTerminal();
/** /**
* @param write a single character to terminal * @param write a single character to terminal

View file

@ -13,10 +13,10 @@ package org.eclipse.tm.internal.terminal.control;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.tm.internal.terminal.emulator.VT100TerminalControl; import org.eclipse.tm.internal.terminal.emulator.VT100TerminalControl;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnectorInfo; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
public class TerminalViewControlFactory { public class TerminalViewControlFactory {
public static ITerminalViewControl makeControl(ITerminalListener target, Composite wndParent, ITerminalConnectorInfo[] connectors) { public static ITerminalViewControl makeControl(ITerminalListener target, Composite wndParent, ITerminalConnector[] connectors) {
return new VT100TerminalControl(target, wndParent, connectors); return new VT100TerminalControl(target, wndParent, connectors);
} }
} }

View file

@ -13,7 +13,7 @@ package org.eclipse.tm.internal.terminal.control.impl;
import java.io.OutputStream; import java.io.OutputStream;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnectorInfo; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
/** /**
@ -27,7 +27,7 @@ public interface ITerminalControlForText {
void setState(TerminalState state); void setState(TerminalState state);
void setTerminalTitle(String title); void setTerminalTitle(String title);
ITerminalConnectorInfo getTerminalConnectorInfo(); ITerminalConnector getTerminalConnector();
void disconnectTerminal(); void disconnectTerminal();

View file

@ -22,4 +22,5 @@ public class TerminalMessages extends NLS {
public static String SocketError; public static String SocketError;
public static String IOError; public static String IOError;
public static String CannotConnectTo; public static String CannotConnectTo;
public static String NotInitialized;
} }

View file

@ -18,3 +18,4 @@ TerminalError = Terminal Error
SocketError = Socket Error SocketError = Socket Error
IOError = IO Error IOError = IO Error
CannotConnectTo = Cannot initialize {0}:\n{1} CannotConnectTo = Cannot initialize {0}:\n{1}
NotInitialized = Not Initialized

View file

@ -1046,8 +1046,8 @@ public class VT100Emulator implements ControlListener {
} }
private ITerminalConnector getConnector() { private ITerminalConnector getConnector() {
if(terminal.getTerminalConnectorInfo()!=null) if(terminal.getTerminalConnector()!=null)
return terminal.getTerminalConnectorInfo().getConnector(); return terminal.getTerminalConnector();
return null; return null;
} }

View file

@ -58,7 +58,6 @@ import org.eclipse.tm.internal.terminal.control.impl.ITerminalControlForText;
import org.eclipse.tm.internal.terminal.control.impl.TerminalMessages; import org.eclipse.tm.internal.terminal.control.impl.TerminalMessages;
import org.eclipse.tm.internal.terminal.control.impl.TerminalPlugin; import org.eclipse.tm.internal.terminal.control.impl.TerminalPlugin;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnectorInfo;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; 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.Logger;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
@ -103,8 +102,8 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
private final ITerminalListener fTerminalListener; private final ITerminalListener fTerminalListener;
private String fMsg = ""; //$NON-NLS-1$ private String fMsg = ""; //$NON-NLS-1$
private FocusListener fFocusListener; private FocusListener fFocusListener;
private ITerminalConnectorInfo fConnectorInfo; private ITerminalConnector fConnector;
private final ITerminalConnectorInfo[] fConnectors; private final ITerminalConnector[] fConnectors;
PipedInputStream fInputStream; PipedInputStream fInputStream;
private ICommandInputField fCommandInputField; private ICommandInputField fCommandInputField;
@ -118,7 +117,7 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
*/ */
volatile private Job fJob; volatile private Job fJob;
public VT100TerminalControl(ITerminalListener target, Composite wndParent, ITerminalConnectorInfo[] connectors) { public VT100TerminalControl(ITerminalListener target, Composite wndParent, ITerminalConnector[] connectors) {
fConnectors=connectors; fConnectors=connectors;
fTerminalListener=target; fTerminalListener=target;
fTerminalModel=TerminalTextDataFactory.makeTerminalTextData(); fTerminalModel=TerminalTextDataFactory.makeTerminalTextData();
@ -129,7 +128,7 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
setupTerminal(wndParent); setupTerminal(wndParent);
} }
public ITerminalConnectorInfo[] getConnectors() { public ITerminalConnector[] getConnectors() {
return fConnectors; return fConnectors;
} }
@ -266,11 +265,11 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
if(getTerminalConnector()==null) if(getTerminalConnector()==null)
return; return;
fTerminalText.resetState(); fTerminalText.resetState();
if(fConnectorInfo.getInitializationErrorMessage()!=null) { if(fConnector.getInitializationErrorMessage()!=null) {
showErrorMessage(NLS.bind( showErrorMessage(NLS.bind(
TerminalMessages.CannotConnectTo, TerminalMessages.CannotConnectTo,
fConnectorInfo.getName(), fConnector.getName(),
fConnectorInfo.getInitializationErrorMessage())); fConnector.getInitializationErrorMessage()));
// we cannot connect because the connector was not initialized // we cannot connect because the connector was not initialized
return; return;
} }
@ -280,10 +279,8 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
waitForConnect(); waitForConnect();
} }
private ITerminalConnector getTerminalConnector() { public ITerminalConnector getTerminalConnector() {
if(fConnectorInfo==null) return fConnector;
return null;
return fConnectorInfo.getConnector();
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#disconnectTerminal() * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#disconnectTerminal()
@ -605,7 +602,7 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
public OutputStream getOutputStream() { public OutputStream getOutputStream() {
if(getTerminalConnector()!=null) if(getTerminalConnector()!=null)
return getTerminalConnector().getOutputStream(); return getTerminalConnector().getTerminalToRemoteStream();
return null; return null;
} }
@ -633,13 +630,6 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
public VT100Emulator getTerminalText() { public VT100Emulator getTerminalText() {
return fTerminalText; return fTerminalText;
} }
/**
*/
public ITerminalConnectorInfo getTerminalConnectorInfo() {
return fConnectorInfo;
}
protected class TerminalFocusListener implements FocusListener { protected class TerminalFocusListener implements FocusListener {
private IContextActivation contextActivation = null; private IContextActivation contextActivation = null;
@ -844,9 +834,9 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
// locally, send a LF after sending a CR. // locally, send a LF after sending a CR.
// ISSUE: Is this absolutely required? // ISSUE: Is this absolutely required?
if (character == '\r' && getTerminalConnectorInfo() != null if (character == '\r' && getTerminalConnector() != null
&& isConnected() && isConnected()
&& getTerminalConnectorInfo().getConnector().isLocalEcho()) { && getTerminalConnector().isLocalEcho()) {
sendChar('\n', false); sendChar('\n', false);
} }
@ -865,8 +855,8 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
// //
// o The character is the DELETE character. // o The character is the DELETE character.
if (getTerminalConnectorInfo() == null if (getTerminalConnector() == null
|| getTerminalConnectorInfo().getConnector().isLocalEcho() == false || altKeyPressed || getTerminalConnector().isLocalEcho() == false || altKeyPressed
|| (character >= '\u0001' && character < '\t') || (character >= '\u0001' && character < '\t')
|| (character > '\t' && character < '\r') || (character > '\t' && character < '\r')
|| (character > '\r' && character <= '\u001f') || (character > '\r' && character <= '\u001f')
@ -912,8 +902,8 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
return ""; //$NON-NLS-1$ return ""; //$NON-NLS-1$
} }
public void setConnector(ITerminalConnectorInfo connector) { public void setConnector(ITerminalConnector connector) {
fConnectorInfo=connector; fConnector=connector;
} }
public ICommandInputField getCommandInputField() { public ICommandInputField getCommandInputField() {

View file

@ -13,11 +13,16 @@ package org.eclipse.tm.internal.terminal.provisional.api;
import java.io.OutputStream; import java.io.OutputStream;
import org.eclipse.core.runtime.IAdaptable;
/** /**
* Manage a single connection. Implementations of this class are contributed * Manage a single connection. Implementations of this class are contributed
* via <code>org.eclipse.tm.terminal.terminalConnector</code> extension point. * via <code>org.eclipse.tm.terminal.terminalConnector</code> extension point.
* * This class is a handle to a {@link ITerminalConnector connector} that comes from an
* extension. It maintains {@link TerminalConnectorImpl} to the connector to allow lazy initialization of the
* real {@link ITerminalConnector connector} that comes from an extension.
* @author Michael Scharf * @author Michael Scharf
* <p> * <p>
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
@ -26,14 +31,31 @@ import java.io.OutputStream;
* consulting with the <a href="http://www.eclipse.org/dsdp/tm/">Target Management</a> team. * consulting with the <a href="http://www.eclipse.org/dsdp/tm/">Target Management</a> team.
* </p> * </p>
*/ */
public interface ITerminalConnector { public interface ITerminalConnector extends IAdaptable {
/** /**
* Initializes the Connector. Some connector depend on external libraries that * @return an ID of this connector. The id from the plugin.xml.
* might not be installed.
* @throws Exception The exception should have a useful
* {@link Exception#getLocalizedMessage()} that explains the problem to the user.
*/ */
void initialize() throws Exception; String getId();
/**
* @return <code>null</code> the name (as specified in the plugin.xml)
*/
String getName();
/**
* @return true if the {@link TerminalConnectorImpl} has been initialized.
* If there was an initialization error, {@link #getInitializationErrorMessage()}
* returns the error message.
*/
boolean isInitialized();
/**
* This method initializes the connector if it is not initialized!
* If the connector was initialized successfully, <code>null</code> is
* returned. Otherwise an error message describing the problem is returned.
* @return <code>null</code> or a localized error message.
*/
String getInitializationErrorMessage();
/** /**
* Connect using the current state of the settings. * Connect using the current state of the settings.
@ -60,9 +82,11 @@ public interface ITerminalConnector {
void setTerminalSize(int newWidth, int newHeight); void setTerminalSize(int newWidth, int newHeight);
/** /**
* @return a stream with data coming from the remote site. * @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()}
*/ */
OutputStream getOutputStream(); OutputStream getTerminalToRemoteStream();
/** /**
* Load the state of this connection. Is typically called before * Load the state of this connection. Is typically called before

View file

@ -1,64 +0,0 @@
/*******************************************************************************
* Copyright (c) 2006, 2007 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:
* Michael Scharf (Wind River) - initial API and implementation
*******************************************************************************/
package org.eclipse.tm.internal.terminal.provisional.api;
/**
* This class is a handle to a {@link ITerminalConnector connector} that comes from an
* extension. It maintains a proxy to the connector to allow lazy initialization of the
* real {@link ITerminalConnector connector} that comes from an extension.
*
* <p>
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
* part of a work in progress. There is no guarantee that this API will
* work or that it will remain the same. Please do not use this API without
* consulting with the <a href="http://www.eclipse.org/dsdp/tm/">Target Management</a> team.
* </p>
*/
public interface ITerminalConnectorInfo {
/**
* @return an ID of this connector. The id from the plugin.xml.
* <p>Note: return <code>null</code> because the framework takes
* care to get the value from the plugin.xml
*/
String getId();
/**
* @return <code>null</code> the name (as specified in the plugin.xml)
* <p>Note: return <code>null</code> because the framework takes
* care to get the value from the plugin.xml
*/
String getName();
/**
* @return true if the ITerminalConnector has been initialized.
* If there was an initialization error, {@link #getInitializationErrorMessage()}
* returns the error message.
*/
boolean isInitialized();
/**
* This method initializes the connector if it is not initialized!
* If the connector was initialized successfully, <code>null</code> is
* returned. Otherwise an error message describing the problem is returned.
* @return <code>null</code> or a localized error message.
*/
String getInitializationErrorMessage();
/**
* Returns a proxy to the connector that is lazily initialized.
* The following methods can be called without initializing
* the contributed class:
* {@link ITerminalConnector#getSettingsSummary()}, {@link ITerminalConnector#load(ISettingsStore)},
* {@link ITerminalConnector#save(ISettingsStore)}, {@link ITerminalConnector#setTerminalSize(int, int)}
* @return a proxy of the real connector. Some calls initialize the the connection.
*/
ITerminalConnector getConnector();
}

View file

@ -56,7 +56,8 @@ public interface ITerminalControl {
/** /**
* @return a stream used to write to the terminal. Any bytes written to this * @return a stream used to write to the terminal. Any bytes written to this
* stream appear in the terminal or are interpreted by the emulator as * stream appear in the terminal or are interpreted by the emulator as
* control sequences. * control sequences. The stream in the opposite direction, terminal
* to remote is in {@link ITerminalConnector#getTerminalToRemoteStream()}.
*/ */
OutputStream getRemoteToTerminalOutputStream(); OutputStream getRemoteToTerminalOutputStream();

View file

@ -11,12 +11,12 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.tm.internal.terminal.provisional.api; package org.eclipse.tm.internal.terminal.provisional.api;
import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.RegistryFactory; import org.eclipse.core.runtime.RegistryFactory;
import org.eclipse.tm.internal.terminal.connector.TerminalConnector;
/** /**
* A factory to get {@link ITerminalConnector} instances. * A factory to get {@link ITerminalConnector} instances.
@ -31,162 +31,47 @@ import org.eclipse.core.runtime.RegistryFactory;
* </p> * </p>
*/ */
public class TerminalConnectorExtension { public class TerminalConnectorExtension {
static private class TerminalConnectorInfo implements ITerminalConnectorInfo { static private ITerminalConnector makeConnector(final IConfigurationElement config) {
TerminalConnectorProxy fProxy; String id = config.getAttribute("id"); //$NON-NLS-1$
TerminalConnectorInfo(TerminalConnectorProxy proxy) { if(id==null || id.length()==0)
fProxy=proxy; id=config.getAttribute("class"); //$NON-NLS-1$
String name= config.getAttribute("name"); //$NON-NLS-1$
if(name==null || name.length()==0) {
name=id;
} }
public ITerminalConnector getConnector() { TerminalConnector.Factory factory=new TerminalConnector.Factory(){
return fProxy; public TerminalConnectorImpl makeConnector() throws Exception {
} return (TerminalConnectorImpl)config.createExecutableExtension("class"); //$NON-NLS-1$
public String getId() { }};
return fProxy.getId(); return new TerminalConnector(factory,id,name);
}
public String getName() {
return fProxy.getName();
}
public String getInitializationErrorMessage() {
return fProxy.getLocalizedErrorMessage();
}
public boolean isInitialized() {
return fProxy.isInitialized();
} }
/**
* @param id the id of the terminal connector in the
* <code>org.eclipse.tm.terminal.terminalConnector</code> extension point
* @return a new ITerminalConnector with id or <code>null</code> if there is no
* extension with that id.
*/
public static ITerminalConnector makeTerminalConnector(String id) {
IConfigurationElement[] config=RegistryFactory.getRegistry().getConfigurationElementsFor("org.eclipse.tm.terminal.terminalConnector"); //$NON-NLS-1$
for (int i = 0; i < config.length; i++) {
if(id.equals(config[i].getAttribute("id"))) { //$NON-NLS-1$
return makeConnector(config[i]);
} }
/**
* A placeholder for the ITerminalConnector. It gets initialized when
* the real connector is needed.
* The following methods can be called without initializing
* the contributed class: {@link #getId()}, {@link #getName()},
* {@link #getSettingsSummary()},{@link #load(ISettingsStore)},
* {@link #setTerminalSize(int, int)}, {@link #save(ISettingsStore)}
*
*/
static private class TerminalConnectorProxy implements ITerminalConnector {
/**
* The connector
*/
private ITerminalConnector fConnector;
/**
* The plugin contribution, needed for lazy initialization
* of {@link #fConnector}
*/
private final IConfigurationElement fConfig;
/**
* If the initialization of the class specified in the extension fails,
* this variable contains the error
*/
private Exception fException;
/**
* The store might be set before the real connector is initialized.
* This keeps the value until the connector is created.
*/
private ISettingsStore fStore;
TerminalConnectorProxy(IConfigurationElement config) {
fConfig=config;
} }
public String getLocalizedErrorMessage() {
getConnector();
if(fException!=null)
return fException.getLocalizedMessage();
return null; return null;
} }
public String getId() {
String id = fConfig.getAttribute("id"); //$NON-NLS-1$
if(id==null || id.length()==0)
id=fConfig.getAttribute("class"); //$NON-NLS-1$
return id;
}
public String getName() {
String name= fConfig.getAttribute("name"); //$NON-NLS-1$
if(name==null || name.length()==0) {
name=getId();
}
return name;
}
private ITerminalConnector getConnector() {
if(!isInitialized()) {
try {
fConnector=createConnector(fConfig);
fConnector.initialize();
} catch (Exception e) {
fConnector=null;
fException=e;
// that's the place where we log the exception
Logger.logException(e);
}
if(fConnector!=null && fStore!=null)
fConnector.load(fStore);
}
return fConnector;
}
private boolean isInitialized() {
return fConnector!=null || fException!=null;
}
public void connect(ITerminalControl control) {
getConnector().connect(control);
}
public void disconnect() {
getConnector().disconnect();
}
public OutputStream getOutputStream() {
return getConnector().getOutputStream();
}
public String getSettingsSummary() {
if(fConnector!=null)
return getConnector().getSettingsSummary();
else
// TODO: see TerminalView.getSettingsSummary
return "?"; //$NON-NLS-1$
}
public boolean isLocalEcho() {
return getConnector().isLocalEcho();
}
public void load(ISettingsStore store) {
if(fConnector==null) {
fStore=store;
} else {
getConnector().load(store);
}
}
public ISettingsPage makeSettingsPage() {
return getConnector().makeSettingsPage();
}
public void save(ISettingsStore store) {
// no need to save the settings: it cannot have changed
// because we are not initialized....
if(fConnector!=null)
getConnector().save(store);
}
public void setTerminalSize(int newWidth, int newHeight) {
// we assume that setTerminalSize is called also after
// the terminal has been initialized. Else we would have to cache
// the values....
if(fConnector!=null) {
fConnector.setTerminalSize(newWidth, newHeight);
}
}
public void initialize() throws Exception {
throw new IllegalStateException("Connector already initialized!"); //$NON-NLS-1$
}
}
/** /**
* @return null or a new connector created from the extension * @return a new list of {@link ITerminalConnector} instances defined in
* the <code>org.eclipse.tm.terminal.terminalConnector</code> extension point
*/ */
static private ITerminalConnector createConnector(IConfigurationElement config) throws Exception { public static ITerminalConnector[] makeTerminalConnectors() {
return (ITerminalConnector)config.createExecutableExtension("class"); //$NON-NLS-1$
}
/**
* @return a new list of ITerminalConnectorInfo.
*/
public static ITerminalConnectorInfo[] getTerminalConnectors() {
IConfigurationElement[] config=RegistryFactory.getRegistry().getConfigurationElementsFor("org.eclipse.tm.terminal.terminalConnector"); //$NON-NLS-1$ IConfigurationElement[] config=RegistryFactory.getRegistry().getConfigurationElementsFor("org.eclipse.tm.terminal.terminalConnector"); //$NON-NLS-1$
List result=new ArrayList(); List result=new ArrayList();
for (int i = 0; i < config.length; i++) { for (int i = 0; i < config.length; i++) {
result.add(new TerminalConnectorInfo(new TerminalConnectorProxy(config[i]))); result.add(makeConnector(config[i]));
} }
return (ITerminalConnectorInfo[]) result.toArray(new ITerminalConnectorInfo[result.size()]); return (ITerminalConnector[]) result.toArray(new ITerminalConnector[result.size()]);
} }
} }

View file

@ -0,0 +1,85 @@
/*******************************************************************************
* Copyright (c) 2007 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:
* Michael Scharf (Wind River) - initial API and implementation
*******************************************************************************/
package org.eclipse.tm.internal.terminal.provisional.api;
import java.io.OutputStream;
public abstract class TerminalConnectorImpl {
/**
* Called once after the constructor
* @throws Exception
*/
public void initialize() throws Exception {
}
/**
* Connect using the current state of the settings.
* @param control Used to inform the UI about state changes and messages from the connection.
*/
abstract public void connect(ITerminalControl control);
/**
* Disconnect if connected. Else do nothing.
* Has to set the state of the {@link ITerminalControl}
*/
abstract public void disconnect();
/**
* @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();
/**
* @return A string that represents the settings of the connection. This representation
* may be shown in the status line of the terminal view.
*/
abstract public String getSettingsSummary();
/**
* @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.
*
*/
abstract public ISettingsPage makeSettingsPage();
/**
* Load the state 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.
*/
abstract public void load(ISettingsStore store);
/**
* When the view or dialog containing the terminal is closed,
* the state of the connection is saved into the settings store <code>store</code>
* @param store
*/
abstract public void save(ISettingsStore store);
/**
* Notify the remote site that the size of the terminal has changed.
* @param newWidth
* @param newHeight
*/
public void setTerminalSize(int newWidth, int newHeight) {
}
}