11package net .sharksystem .cmdline ;
22
3+ import net .sharksystem .asap .*;
4+
35import java .io .*;
46import java .util .HashMap ;
57import java .util .Map ;
68import java .util .StringTokenizer ;
79
810/**
9- * commands
10- * - open
11- * - connect
12- * - list
13- * - kill
14- *
1511 * @author thsc
1612 */
1713public 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
0 commit comments