/******************************************************************************* * Copyright (c) 2005, 2017 IBM Corporation 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 * *******************************************************************************/ package org.eclipse.dltk.tcl.console; import java.io.IOException; import java.io.InputStream; import java.net.SocketException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.dltk.compiler.CharOperation; import org.eclipse.dltk.compiler.util.Util; import org.eclipse.dltk.console.IScriptConsoleIO; import org.eclipse.dltk.console.IScriptExecResult; import org.eclipse.dltk.console.IScriptInterpreter; import org.eclipse.dltk.console.InterpreterResponse; import org.eclipse.dltk.console.ScriptExecResult; import org.eclipse.dltk.console.ShellResponse; public class TclInterpreter implements IScriptInterpreter { private static final String COMPLETE_COMMAND = "complete"; //$NON-NLS-1$ private static final String DESCRIBE_COMMAND = "describe"; //$NON-NLS-1$ private static final String CLOSE_COMMAND = "close"; //$NON-NLS-1$ private IScriptConsoleIO protocol; private int state; private List<Runnable> closeRunnables = new ArrayList<>(); private List<Runnable> initialListeners = new ArrayList<>(); // IScriptInterpreter @Override public IScriptExecResult exec(String command) throws IOException { InterpreterResponse response = protocol.execInterpreter(command); if (response != null) { state = response.getState(); return new ScriptExecResult(response.getContent(), response.isError()); } else { return null; } } @Override public boolean isValid() { return protocol != null; } @Override public int getState() { return state; } // IScriptInterpreterShell @Override public List getCompletions(String commandLine, int position) throws IOException { String[] args = new String[] { commandLine, Integer.toString(position) }; ShellResponse response = protocol.execShell(COMPLETE_COMMAND, args); return response.getCompletions(); } @Override public String getDescription(String commandLine, int position) throws IOException { String[] args = new String[] { commandLine, Integer.toString(position) }; ShellResponse response = protocol.execShell(DESCRIBE_COMMAND, args); return response != null ? response.getDescription() : Util.EMPTY_STRING; } @Override public String[] getNames(String type) throws IOException { return null; } @Override public void close() throws IOException { try { if (protocol != null) { protocol.execShell(CLOSE_COMMAND, CharOperation.NO_STRINGS); protocol.close(); } // run all close runnables. for (Iterator<Runnable> iterator = this.closeRunnables.iterator(); iterator.hasNext();) { Runnable op = iterator.next(); op.run(); } } catch (SocketException e) { } } // IScriptConsoleProtocol @Override public void consoleConnected(IScriptConsoleIO protocol) { this.protocol = protocol; for (Iterator<Runnable> iterator = this.initialListeners.iterator(); iterator.hasNext();) { Runnable op = iterator.next(); Thread t = new Thread(op); t.run(); } this.initialListeners.clear(); } public void addCloseOperation(Runnable runnable) { this.closeRunnables.add(runnable); } @Override public void addInitialListenerOperation(Runnable runnable) { if (this.protocol != null) { new Thread(runnable).start(); } else { this.initialListeners.add(runnable); } } @Override public InputStream getInitialOutputStream() { return protocol.getInitialResponseStream(); } }