/* * Copyright 1999-2002 Carnegie Mellon University. * Portions Copyright 2002 Sun Microsystems, Inc. * Portions Copyright 2002 Mitsubishi Electric Research Laboratories. * All Rights Reserved. Use is subject to license terms. * * See the file "license.terms" for information on usage and * redistribution of this file, and for a DISCLAIMER OF ALL * WARRANTIES. * */ package edu.cmu.sphinx.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * This class is a command interpreter. It reads strings from an input stream, parses them into commands and executes * them, results are sent back on the output stream. * * @see CommandInterpreter */ public class SocketCommandInterpreter extends Thread { private final int port; private final Map<String, CommandInterface> commandList; private boolean trace; private boolean acceptConnections = true; /** * Creates a command interpreter at the given port. * * @param port the port to create the command interpreter */ public SocketCommandInterpreter(int port) { this.port = port; commandList = new HashMap<String, CommandInterface>(); } /** * Adds the given command to the command list. * * @param name the name of the command. * @param command the command to be executed. */ public void add(String name, CommandInterface command) { commandList.put(name, command); } // Implements the run() method of Runnable @Override public final void run() { ServerSocket ss; try { ss = new ServerSocket(port); System.out.println("Waiting on " + ss); } catch (IOException ioe) { System.out.println("Can't open socket on port " + port); ioe.printStackTrace(); return; } while (acceptConnections) { try { Socket s = ss.accept(); spawnCommandInterpreter(s); } catch (IOException ioe) { System.err.println("Could not accept socket " + ioe); ioe.printStackTrace(); break; } } try { ss.close(); } catch (IOException ioe) { System.err.println("Could not close server socket " + ioe); ioe.printStackTrace(); } } /** Stops this SocketCommandInterpreter from accepting connections. Effectively stops this thread. */ public void setStopAcceptConnections() { acceptConnections = false; } /** * Sets the trace mode of the command interpreter. * * @param trace true if tracing. */ public void setTrace(boolean trace) { this.trace = trace; } /** * spawns a command interpreter * * @param s the socket where the interpeter reads/writes to/from */ private void spawnCommandInterpreter(Socket s) { try { BufferedReader inReader = new BufferedReader( new InputStreamReader(s.getInputStream())); PrintWriter outWriter = new PrintWriter( s.getOutputStream(), true); CommandInterpreter ci = new CommandInterpreter(inReader, outWriter); ci.setSocket(s); ci.add(commandList); ci.setTrace(trace); ci.start(); } catch (IOException ioe) { System.err.println("Could not attach CI to socket " + ioe); } } public static void main(String[] args) { SocketCommandInterpreter sci = new SocketCommandInterpreter(7890); sci.add("testCommand", new CommandInterface() { public String execute(CommandInterpreter ci, String[] args) { return "this is a test"; } public String getHelp() { return "a test command"; } }); sci.add("time", new CommandInterface() { public String execute(CommandInterpreter ci, String[] args) { return "Time is " + new Date(); } public String getHelp() { return "shows the current time"; } }); System.out.println("Welcome to SocketCommand interpreter test program"); sci.setTrace(true); sci.start(); } }