Skip to content

Commit c84b940

Browse files
committed
start implementing a command line user interface
1 parent d9debab commit c84b940

1 file changed

Lines changed: 218 additions & 0 deletions

File tree

Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
package net.sharksystem.cmdline;
2+
3+
import net.sharksystem.util.localloop.TCPChannel;
4+
import sun.rmi.transport.tcp.TCPConnection;
5+
6+
import java.io.*;
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
import java.util.StringTokenizer;
10+
11+
/**
12+
* commands
13+
* - open
14+
* - connect
15+
* - list
16+
* - kill
17+
*
18+
* @author thsc
19+
*/
20+
public class CmdLineUI {
21+
public static final String CONNECT = "connect";
22+
public static final String OPEN = "open";
23+
public static final String EXIT = "exit";
24+
public static final String LIST = "list";
25+
public static final String KILL = "kill";
26+
27+
private final PrintStream consoleOutput;
28+
private final BufferedReader userInput;
29+
30+
public static void main(String[] args) {
31+
PrintStream os = System.out;
32+
33+
os.println("Welcome SN2 version 0.1");
34+
CmdLineUI userCmd = new CmdLineUI(os, System.in);
35+
36+
userCmd.printUsage();
37+
userCmd.runGame();
38+
}
39+
40+
public CmdLineUI(PrintStream os, InputStream is) {
41+
this.consoleOutput = os;
42+
this.userInput = new BufferedReader(new InputStreamReader(is));
43+
}
44+
45+
public void printUsage() {
46+
StringBuilder b = new StringBuilder();
47+
48+
b.append("\n");
49+
b.append("\n");
50+
b.append("valid commands:");
51+
b.append("\n");
52+
b.append(CONNECT);
53+
b.append(".. connect to remote engine");
54+
b.append("\n");
55+
b.append(OPEN);
56+
b.append(".. open socket");
57+
b.append("\n");
58+
b.append(EXIT);
59+
b.append(".. exit");
60+
61+
this.consoleOutput.println(b.toString());
62+
}
63+
64+
public void printUsage(String cmdString, String comment) {
65+
PrintStream out = this.consoleOutput;
66+
67+
if(comment == null) comment = " ";
68+
out.println("malformed command: " + comment);
69+
out.println("use:");
70+
switch(cmdString) {
71+
case CONNECT:
72+
out.println(CONNECT + " IP/DNS-Name_remoteHost remotePort");
73+
out.println("example: " + CONNECT + " localhost 7070");
74+
out.println("tries to connect to localhost:7070");
75+
break;
76+
case OPEN:
77+
out.println(OPEN + " localPort");
78+
out.println("example: " + OPEN + " 7070");
79+
out.println("opens a server socket #7070");
80+
break;
81+
case LIST:
82+
out.println("lists all open connections / client and server");
83+
break;
84+
case KILL:
85+
out.println(KILL + " channel name");
86+
out.println("example: " + KILL + "localhost:7070");
87+
out.println("kills channel named localhost:7070");
88+
out.println("channel names are produced by using list");
89+
break;
90+
}
91+
92+
out.println("unknown command: " + cmdString);
93+
}
94+
95+
public void runGame() {
96+
97+
boolean again = true;
98+
while(again) {
99+
System.out.println("TODO: do not use that TCPChannel Class");
100+
101+
try {
102+
// read user input
103+
String cmdLineString = userInput.readLine();
104+
105+
// finish that loop if less than nothing came in
106+
if(cmdLineString == null) break;
107+
108+
// trim whitespaces on both sides
109+
cmdLineString = cmdLineString.trim();
110+
111+
// extract command
112+
int spaceIndex = cmdLineString.indexOf(' ');
113+
spaceIndex = spaceIndex != -1 ? spaceIndex : cmdLineString.length();
114+
115+
// got command string
116+
String commandString = cmdLineString.substring(0, spaceIndex);
117+
118+
// extract parameters string - can be empty
119+
String parameterString = cmdLineString.substring(spaceIndex);
120+
parameterString = parameterString.trim();
121+
122+
// start command loop
123+
switch(commandString) {
124+
case CONNECT:
125+
this.doConnect(parameterString); break;
126+
case OPEN:
127+
this.doOpen(parameterString); break;
128+
case LIST:
129+
this.doList(); break;
130+
case KILL:
131+
this.doKill(parameterString); break;
132+
case "q": // convenience
133+
case EXIT:
134+
again = false; break; // end loop
135+
136+
default: this.consoleOutput.println("unknown command:" +
137+
cmdLineString);
138+
this.printUsage();
139+
break;
140+
}
141+
} catch (IOException ex) {
142+
this.consoleOutput.println("cannot read from input stream");
143+
System.exit(0);
144+
}
145+
}
146+
}
147+
148+
private Map<String, TCPChannel> openConnections = new HashMap<>();
149+
150+
private void startChannel(String name, TCPChannel channel) {
151+
channel.start();
152+
this.openConnections.put(name, channel);
153+
}
154+
155+
private void doConnect(String parameterString) {
156+
StringTokenizer st = new StringTokenizer(parameterString);
157+
158+
try {
159+
String remoteHost = st.nextToken();
160+
String remotePortString = st.nextToken();
161+
int remotePort = Integer.parseInt(remotePortString);
162+
163+
String name = remoteHost + ":" + remotePortString;
164+
165+
this.startChannel(name, new TCPChannel(remotePort, false, name));
166+
}
167+
catch(RuntimeException re) {
168+
this.printUsage(CONNECT, re.getLocalizedMessage());
169+
}
170+
}
171+
172+
private void doOpen(String parameterString) {
173+
StringTokenizer st = new StringTokenizer(parameterString);
174+
175+
try {
176+
String portString = st.nextToken();
177+
178+
int port = Integer.parseInt(portString);
179+
String name = "server:" + port;
180+
181+
this.startChannel(name, new TCPChannel(port, true, name));
182+
}
183+
catch(RuntimeException re) {
184+
this.printUsage(OPEN, re.getLocalizedMessage());
185+
}
186+
}
187+
188+
private void doList() {
189+
for(String connectionName : this.openConnections.keySet()) {
190+
System.out.println(connectionName);
191+
}
192+
}
193+
194+
private void doKill(String parameterString) {
195+
StringTokenizer st = new StringTokenizer(parameterString);
196+
197+
String channelName = st.nextToken();
198+
TCPChannel channel = this.openConnections.remove(channelName);
199+
if(channel == null) {
200+
System.err.println("channel does not exist: " + channelName);
201+
return;
202+
}
203+
System.out.println("close channel");
204+
InputStream inputStream = null;
205+
try {
206+
inputStream = channel.getInputStream();
207+
inputStream.close();
208+
channel.getOutputStream().close();
209+
}
210+
catch(IOException e) {
211+
System.out.println("no open stream yet - kill anyway");
212+
channel.interrupt();
213+
}
214+
215+
System.out.println(".. done");
216+
}
217+
}
218+

0 commit comments

Comments
 (0)