Skip to content

Commit b041fc6

Browse files
committed
finished implementing a command line user interface
1 parent a58d44e commit b041fc6

File tree

5 files changed

+232
-28
lines changed

5 files changed

+232
-28
lines changed

src/net/sharksystem/asap/MultiASAPEngineFS_Impl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ public static MultiASAPEngineFS createMultiEngine(CharSequence folder, ASAPChunk
3333
* root directory. setting list can be created by iterating those storages.
3434
* @param rootFolderName
3535
*/
36-
MultiASAPEngineFS_Impl(CharSequence owner, CharSequence rootFolderName, long maxExecutionTime,
37-
ASAPChunkReceivedListener listener) throws ASAPException, IOException {
36+
private MultiASAPEngineFS_Impl(CharSequence owner, CharSequence rootFolderName, long maxExecutionTime,
37+
ASAPChunkReceivedListener listener) throws ASAPException, IOException {
3838
this.owner = owner;
3939
this.maxExecutionTime = maxExecutionTime;
4040
this.rootFolderName = rootFolderName;

src/net/sharksystem/cmdline/CmdLineUI.java

Lines changed: 181 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
11
package net.sharksystem.cmdline;
22

3+
import net.sharksystem.asap.*;
4+
35
import java.io.*;
46
import java.util.HashMap;
57
import java.util.Map;
68
import java.util.StringTokenizer;
79

810
/**
9-
* commands
10-
* - open
11-
* - connect
12-
* - list
13-
* - kill
14-
*
1511
* @author thsc
1612
*/
1713
public class CmdLineUI {
14+
// commands
1815
public static final String CONNECT = "connect";
1916
public static final String OPEN = "open";
2017
public static final String EXIT = "exit";
2118
public static final String LIST = "list";
2219
public static final String KILL = "kill";
20+
public static final String SETWAITING = "setwaiting";
21+
public static final String CREATE_ASAP_ENGINE = "newengine";
22+
public static final String CREATE_ASAP_STORAGE = "newstorage";
23+
public static final String CREATE_ASAP_MESSAGE = "newmessage";
24+
public static final String RESET_ASAP_STORAGES = "resetstorage";
2325

2426
private final PrintStream consoleOutput;
2527
private final BufferedReader userInput;
@@ -31,7 +33,7 @@ public static void main(String[] args) {
3133
CmdLineUI userCmd = new CmdLineUI(os, System.in);
3234

3335
userCmd.printUsage();
34-
userCmd.runGame();
36+
userCmd.runCommandLoop();
3537
}
3638

3739
public CmdLineUI(PrintStream os, InputStream is) {
@@ -58,6 +60,21 @@ public void printUsage() {
5860
b.append(KILL);
5961
b.append(".. kill an open connection");
6062
b.append("\n");
63+
b.append(SETWAITING);
64+
b.append(".. set waiting period");
65+
b.append("\n");
66+
b.append(CREATE_ASAP_ENGINE);
67+
b.append(".. create new asap engine");
68+
b.append("\n");
69+
b.append(CREATE_ASAP_STORAGE);
70+
b.append(".. create new asap storage");
71+
b.append("\n");
72+
b.append(CREATE_ASAP_MESSAGE);
73+
b.append(".. add message to storage");
74+
b.append("\n");
75+
b.append(RESET_ASAP_STORAGES);
76+
b.append(".. removes all asap storages");
77+
b.append("\n");
6178
b.append(EXIT);
6279
b.append(".. exit");
6380

@@ -73,30 +90,55 @@ public void printUsage(String cmdString, String comment) {
7390
switch(cmdString) {
7491
case CONNECT:
7592
out.println(CONNECT + " IP/DNS-Name_remoteHost remotePort");
76-
out.println("example: " + CONNECT + " localhost 7070");
77-
out.println("tries to connect to localhost:7070");
93+
out.println("example: " + CONNECT + " localhost 7070 Bob");
94+
out.println("tries to connect to localhost:7070 and let engine Bob handle connection when established");
7895
break;
7996
case OPEN:
80-
out.println(OPEN + " localPort");
81-
out.println("example: " + OPEN + " 7070");
82-
out.println("opens a server socket #7070");
97+
out.println(OPEN + " localPort engineName");
98+
out.println("example: " + OPEN + " 7070 Alice");
99+
out.println("opens a server socket #7070 and let engine Alice handle connection when established");
83100
break;
84101
case LIST:
85102
out.println("lists all open connections / client and server");
86103
break;
87104
case KILL:
88105
out.println(KILL + " channel name");
89-
out.println("example: " + KILL + "localhost:7070");
106+
out.println("example: " + KILL + " localhost:7070");
90107
out.println("kills channel named localhost:7070");
91108
out.println("channel names are produced by using list");
92109
out.println(KILL + "all .. kills all open connections");
93110
break;
111+
case SETWAITING:
112+
out.println(SETWAITING + " number of millis to wait between two connection attempts");
113+
out.println("example: " + KILL + " 1000");
114+
out.println("set waiting period to one second");
115+
break;
116+
case CREATE_ASAP_ENGINE:
117+
out.println(CREATE_ASAP_ENGINE + " name");
118+
out.println("example: " + CREATE_ASAP_ENGINE + " Alice");
119+
out.println("create engine called Alice - data kept under a folder called tests/Alice");
120+
break;
121+
case CREATE_ASAP_STORAGE:
122+
out.println(CREATE_ASAP_STORAGE + " owner appName");
123+
out.println("example: " + CREATE_ASAP_STORAGE + " Alice chat");
124+
break;
125+
case CREATE_ASAP_MESSAGE:
126+
out.println(CREATE_ASAP_MESSAGE + " owner appName uri message");
127+
out.println("example: " + CREATE_ASAP_MESSAGE + " Alice chat sn2://abChat HiBob");
128+
out.println("note: message can only be ONE string. That would not work:");
129+
out.println("does not work: " + CREATE_ASAP_MESSAGE + " Alice chat sn2://abChat Hi Bob");
130+
out.println("five parameters instead of four.");
131+
break;
132+
case RESET_ASAP_STORAGES:
133+
out.println(RESET_ASAP_STORAGES);
134+
out.println("removes all storages");
135+
break;
94136
}
95137

96138
out.println("unknown command: " + cmdString);
97139
}
98140

99-
public void runGame() {
141+
public void runCommandLoop() {
100142

101143
boolean again = true;
102144
while(again) {
@@ -132,6 +174,16 @@ public void runGame() {
132174
this.doList(); break;
133175
case KILL:
134176
this.doKill(parameterString); break;
177+
case SETWAITING:
178+
this.doSetWaiting(parameterString); break;
179+
case CREATE_ASAP_ENGINE:
180+
this.doCreateASAPMultiEngine(parameterString); break;
181+
case CREATE_ASAP_STORAGE:
182+
this.doCreateASAPStorage(parameterString); break;
183+
case CREATE_ASAP_MESSAGE:
184+
this.doCreateASAPMessage(parameterString); break;
185+
case RESET_ASAP_STORAGES:
186+
ASAPEngineFS.removeFolder("tests"); break;
135187
case "q": // convenience
136188
case EXIT:
137189
this.doKill("all");
@@ -149,12 +201,23 @@ public void runGame() {
149201
}
150202
}
151203

152-
private Map<String, TCPChannel> openConnections = new HashMap<>();
204+
private Map<String, TCPChannel> channels = new HashMap<>();
205+
private long waitPeriod = 1000*30; // 30 seconds
153206

154-
private void startChannel(String name, TCPChannel channel) {
155-
channel.setWaitPeriod(1000*30); // 30 seconds
207+
private void setWaitPeriod(long period) {
208+
this.waitPeriod = period;
209+
}
210+
211+
private void startChannel(String name, TCPChannel channel, String engineName) throws ASAPException {
212+
channel.setWaitPeriod(this.waitPeriod);
213+
MultiASAPEngineFS multiASAPEngineFS = this.engines.get(engineName);
214+
if(multiASAPEngineFS == null) {
215+
throw new ASAPException("engine does not exist: " + engineName);
216+
}
217+
218+
channel.setListener(new TCPChannelCreatedHandler(multiASAPEngineFS));
156219
channel.start();
157-
this.openConnections.put(name, channel);
220+
this.channels.put(name, channel);
158221
}
159222

160223
private void doConnect(String parameterString) {
@@ -163,14 +226,17 @@ private void doConnect(String parameterString) {
163226
try {
164227
String remoteHost = st.nextToken();
165228
String remotePortString = st.nextToken();
229+
String engineName = st.nextToken();
166230
int remotePort = Integer.parseInt(remotePortString);
167231

168232
String name = remoteHost + ":" + remotePortString;
169233

170-
this.startChannel(name, new TCPChannel(remotePort, false, name));
234+
this.startChannel(name, new TCPChannel(remotePort, false, name), engineName);
171235
}
172236
catch(RuntimeException re) {
173237
this.printUsage(CONNECT, re.getLocalizedMessage());
238+
} catch (ASAPException e) {
239+
this.printUsage(CONNECT, e.getLocalizedMessage());
174240
}
175241
}
176242

@@ -179,21 +245,29 @@ private void doOpen(String parameterString) {
179245

180246
try {
181247
String portString = st.nextToken();
248+
String engineName = st.nextToken();
182249

183250
int port = Integer.parseInt(portString);
184251
String name = "server:" + port;
185252

186-
this.startChannel(name, new TCPChannel(port, true, name));
253+
this.startChannel(name, new TCPChannel(port, true, name), engineName);
187254
}
188255
catch(RuntimeException re) {
189256
this.printUsage(OPEN, re.getLocalizedMessage());
257+
} catch (ASAPException e) {
258+
this.printUsage(OPEN, e.getLocalizedMessage());
190259
}
191260
}
192261

193262
private void doList() {
194-
for(String connectionName : this.openConnections.keySet()) {
263+
System.out.println("connections:");
264+
for(String connectionName : this.channels.keySet()) {
195265
System.out.println(connectionName);
196266
}
267+
System.out.println("engines:");
268+
for(String engineName : this.engines.keySet()) {
269+
System.out.println(engineName);
270+
}
197271
}
198272

199273
private void doKill(String parameterString) {
@@ -203,14 +277,14 @@ private void doKill(String parameterString) {
203277
String channelName = st.nextToken();
204278
if(channelName.equalsIgnoreCase("all")) {
205279
System.out.println("kill all open channels..");
206-
for(TCPChannel channel : this.openConnections.values()) {
280+
for(TCPChannel channel : this.channels.values()) {
207281
channel.kill();
208282
}
209-
this.openConnections = new HashMap<>();
283+
this.channels = new HashMap<>();
210284
System.out.println(".. done");
211285
} else {
212286

213-
TCPChannel channel = this.openConnections.remove(channelName);
287+
TCPChannel channel = this.channels.remove(channelName);
214288
if (channel == null) {
215289
System.err.println("channel does not exist: " + channelName);
216290
return;
@@ -225,5 +299,88 @@ private void doKill(String parameterString) {
225299
this.printUsage(KILL, e.getLocalizedMessage());
226300
}
227301
}
302+
303+
private void doSetWaiting(String parameterString) {
304+
StringTokenizer st = new StringTokenizer(parameterString);
305+
306+
try {
307+
String waitingPeriodString = st.nextToken();
308+
long period = Long.parseLong(waitingPeriodString);
309+
this.setWaitPeriod(period);
310+
}
311+
catch(RuntimeException e) {
312+
this.printUsage(SETWAITING, e.getLocalizedMessage());
313+
}
314+
}
315+
316+
public static final String TESTS_ROOT_FOLDER = "tests";
317+
private Map<String, MultiASAPEngineFS> engines = new HashMap();
318+
private void doCreateASAPMultiEngine(String parameterString) {
319+
StringTokenizer st = new StringTokenizer(parameterString);
320+
321+
try {
322+
String engineName = st.nextToken();
323+
this.engines.put(
324+
engineName,
325+
MultiASAPEngineFS_Impl.createMultiEngine(engineName,
326+
TESTS_ROOT_FOLDER + "/" + engineName,
327+
this.waitPeriod, null));
328+
}
329+
catch(RuntimeException e) {
330+
this.printUsage(CREATE_ASAP_ENGINE, e.getLocalizedMessage());
331+
} catch (IOException | ASAPException e) {
332+
this.printUsage(CREATE_ASAP_ENGINE, e.getLocalizedMessage());
333+
}
334+
}
335+
336+
private String getStorageKey(String owner, String appName) {
337+
return owner + ":" + appName;
338+
}
339+
340+
private Map<String, ASAPStorage> storages = new HashMap();
341+
private void doCreateASAPStorage(String parameterString) {
342+
StringTokenizer st = new StringTokenizer(parameterString);
343+
344+
try {
345+
String owner = st.nextToken();
346+
String appName = st.nextToken();
347+
String appFolderName = TESTS_ROOT_FOLDER + "/" + owner + "/" + appName;
348+
String format = "sn2://" + appName;
349+
350+
ASAPStorage storage =
351+
ASAPEngineFS.getASAPStorage(owner, appFolderName, format);
352+
353+
this.storages.put(this.getStorageKey(owner, appName), storage);
354+
}
355+
catch(RuntimeException e) {
356+
this.printUsage(CREATE_ASAP_STORAGE, e.getLocalizedMessage());
357+
} catch (IOException | ASAPException e) {
358+
this.printUsage(CREATE_ASAP_STORAGE, e.getLocalizedMessage());
359+
}
360+
}
361+
362+
private void doCreateASAPMessage(String parameterString) {
363+
StringTokenizer st = new StringTokenizer(parameterString);
364+
365+
try {
366+
String owner = st.nextToken();
367+
String appName = st.nextToken();
368+
String uri = st.nextToken();
369+
String message = st.nextToken();
370+
371+
// first - get storage
372+
ASAPStorage asapStorage = this.storages.get(this.getStorageKey(owner, appName));
373+
if(asapStorage == null) {
374+
System.err.println("storage does not exist: " + this.getStorageKey(owner, appName));
375+
return;
376+
}
377+
asapStorage.add(uri, message);
378+
}
379+
catch(RuntimeException e) {
380+
this.printUsage(CREATE_ASAP_MESSAGE, e.getLocalizedMessage());
381+
} catch (IOException e) {
382+
this.printUsage(CREATE_ASAP_MESSAGE, e.getLocalizedMessage());
383+
}
384+
}
228385
}
229386

src/net/sharksystem/cmdline/TCPChannel.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class TCPChannel extends Thread {
1414
private final int port;
1515
private final boolean asServer;
1616
private final String name;
17+
private TCPChannelCreatedListener listener = null;
1718
private Socket socket = null;
1819

1920
private boolean fatalError = false;
@@ -24,10 +25,19 @@ public class TCPChannel extends Thread {
2425
private TCPClient tcpClient = null;
2526
private long waitInMillis = WAIT_LOOP_IN_MILLIS;
2627

27-
public TCPChannel(int port, boolean asServer, String name) {
28+
public TCPChannel(int port, boolean asServer, String name, TCPChannelCreatedListener listener) {
2829
this.port = port;
2930
this.asServer = asServer;
3031
this.name = name;
32+
this.listener = listener;
33+
}
34+
35+
public TCPChannel(int port, boolean asServer, String name) {
36+
this(port, asServer, name, null);
37+
}
38+
39+
public void setListener(TCPChannelCreatedListener listener) {
40+
this.listener = listener;
3141
}
3242

3343
public void setWaitPeriod(long waitInMillis) {
@@ -65,10 +75,15 @@ public void run() {
6575
}
6676
} catch (IOException ex) {
6777
//<<<<<<<<<<<<<<<<<<debug
68-
String s = "couldn't esatblish connection";
78+
String s = "couldn't establish connection";
6979
System.out.println(s);
7080
this.fatalError = true;
7181
}
82+
finally {
83+
if(this.listener != null) {
84+
this.listener.channelCreated(this);
85+
}
86+
}
7287
}
7388

7489
public void close() throws IOException {

0 commit comments

Comments
 (0)