001 package org.crsh.shell.impl.remoting; 002 003 import org.crsh.cmdline.CommandCompletion; 004 import org.crsh.shell.Shell; 005 import org.crsh.shell.ShellProcess; 006 import org.crsh.util.CloseableList; 007 008 import java.io.Closeable; 009 import java.io.IOException; 010 import java.io.InputStream; 011 import java.io.ObjectInputStream; 012 import java.io.ObjectOutputStream; 013 import java.io.OutputStream; 014 015 /** @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */ 016 public class ClientAutomaton implements Runnable { 017 018 /** . */ 019 final Shell shell; 020 021 /** . */ 022 final ObjectOutputStream out; 023 024 /** . */ 025 final ObjectInputStream in; 026 027 /** . */ 028 ClientProcessContext current; 029 030 /** . */ 031 final CloseableList listeners; 032 033 public ClientAutomaton(ObjectOutputStream out, ObjectInputStream in, Shell shell) { 034 CloseableList listeners = new CloseableList(); 035 listeners.add(in); 036 listeners.add(out); 037 038 // 039 this.in = in; 040 this.out = out; 041 this.shell = shell; 042 this.listeners = listeners; 043 } 044 045 public ClientAutomaton(InputStream in,OutputStream out, Shell shell) throws IOException { 046 this(new ObjectOutputStream(out), new ObjectInputStream(in), shell); 047 } 048 049 public ClientAutomaton addCloseListener(Closeable closeable) { 050 listeners.add(closeable); 051 return this; 052 } 053 054 public void run() { 055 try { 056 while (!listeners.isClosed()) { 057 ClientMessage msg = (ClientMessage)in.readObject(); 058 switch (msg) { 059 case GET_WELCOME: 060 String welcome = shell.getWelcome(); 061 out.writeObject(welcome); 062 out.flush(); 063 break; 064 case GET_PROMPT: 065 String prompt = shell.getPrompt(); 066 out.writeObject(prompt); 067 out.flush(); 068 break; 069 case GET_COMPLETION: 070 String prefix = (String)in.readObject(); 071 CommandCompletion completion = shell.complete(prefix); 072 out.writeObject(completion); 073 out.flush(); 074 break; 075 case EXECUTE: 076 String line = (String)in.readObject(); 077 ShellProcess process = shell.createProcess(line); 078 current = new ClientProcessContext(this, process); 079 process.execute(current); 080 break; 081 case CANCEL: 082 if (current != null) { 083 current.process.cancel(); 084 } 085 break; 086 case CLOSE: 087 close(); 088 break; 089 } 090 } 091 } 092 catch (Exception e) { 093 // e.printStackTrace(); 094 // 095 } 096 } 097 098 void close() { 099 listeners.close(); 100 } 101 }