CLI.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package ui;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.net.InetSocketAddress;
  5. import org.apache.commons.cli.CommandLine;
  6. import org.apache.commons.cli.CommandLineParser;
  7. import org.apache.commons.cli.GnuParser;
  8. import org.apache.commons.cli.Options;
  9. import org.apache.commons.cli.ParseException;
  10. import communication.Communication;
  11. import exceptions.NoSuchPartyException;
  12. import protocols.Party;
  13. import protocols.Protocol;
  14. import protocols.SSCOT;
  15. import protocols.SSIOT;
  16. import protocols.Reshuffle;
  17. import protocols.PostProcessT;
  18. import protocols.SSXOT;
  19. import protocols.Access;
  20. public class CLI {
  21. public static final int DEFAULT_PORT = 8000;
  22. public static final String DEFAULT_IP = "localhost";
  23. public static void main(String[] args) {
  24. // Setup command line argument parser
  25. Options options = new Options();
  26. options.addOption("config", true, "Config file");
  27. options.addOption("forest", true, "Forest file");
  28. options.addOption("eddie_ip", true, "IP to look for eddie");
  29. options.addOption("debbie_ip", true, "IP to look for debbie");
  30. options.addOption("protocol", true, "Algorithim to test");
  31. // Parse the command line arguments
  32. CommandLineParser cmdParser = new GnuParser();
  33. CommandLine cmd = null;
  34. try {
  35. cmd = cmdParser.parse(options, args);
  36. } catch (ParseException e1) {
  37. e1.printStackTrace();
  38. }
  39. String configFile = cmd.getOptionValue("config", "config.yaml");
  40. String forestFile = cmd.getOptionValue("forest", null);
  41. String party = null;
  42. String[] positionalArgs = cmd.getArgs();
  43. if (positionalArgs.length > 0) {
  44. party = positionalArgs[0];
  45. } else {
  46. try {
  47. throw new ParseException("No party specified");
  48. } catch (ParseException e) {
  49. e.printStackTrace();
  50. System.exit(-1);
  51. }
  52. }
  53. int extra_port = 1;
  54. int eddiePort1 = DEFAULT_PORT;
  55. int eddiePort2 = eddiePort1 + extra_port;
  56. int debbiePort = eddiePort2 + extra_port;
  57. String eddieIp = cmd.getOptionValue("eddie_ip", DEFAULT_IP);
  58. String debbieIp = cmd.getOptionValue("debbie_ip", DEFAULT_IP);
  59. Class<? extends Protocol> operation = null;
  60. String protocol = cmd.getOptionValue("protocol", "retrieve").toLowerCase();
  61. if (protocol.equals("sscot")) {
  62. operation = SSCOT.class;
  63. } else if (protocol.equals("ssiot")) {
  64. operation = SSIOT.class;
  65. } else if (protocol.equals("reshuffle")) {
  66. operation = Reshuffle.class;
  67. } else if (protocol.equals("ppt")) {
  68. operation = PostProcessT.class;
  69. } else if (protocol.equals("ssxot")) {
  70. operation = SSXOT.class;
  71. } else if (protocol.equals("access")) {
  72. operation = Access.class;
  73. } else {
  74. System.out.println("Protocol " + protocol + " not supported");
  75. System.exit(-1);
  76. }
  77. Constructor<? extends Protocol> operationCtor = null;
  78. try {
  79. operationCtor = operation.getDeclaredConstructor(Communication.class, Communication.class);
  80. } catch (NoSuchMethodException | SecurityException e1) {
  81. e1.printStackTrace();
  82. }
  83. // For now all logic happens here. Eventually this will get wrapped
  84. // up in party specific classes.
  85. System.out.println("Starting " + party + "...");
  86. if (party.equals("eddie")) {
  87. Communication debbieCon = new Communication();
  88. debbieCon.start(eddiePort1);
  89. Communication charlieCon = new Communication();
  90. charlieCon.start(eddiePort2);
  91. System.out.println("Waiting to establish connections...");
  92. while (debbieCon.getState() != Communication.STATE_CONNECTED)
  93. ;
  94. while (charlieCon.getState() != Communication.STATE_CONNECTED)
  95. ;
  96. System.out.println("Connection established.");
  97. debbieCon.setTcpNoDelay(true);
  98. charlieCon.setTcpNoDelay(true);
  99. debbieCon.write("start");
  100. charlieCon.write("start");
  101. debbieCon.readString();
  102. charlieCon.readString();
  103. try {
  104. operationCtor.newInstance(debbieCon, charlieCon).run(Party.Eddie, configFile, forestFile);
  105. } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
  106. | InvocationTargetException e) {
  107. e.printStackTrace();
  108. }
  109. debbieCon.write("end");
  110. charlieCon.write("end");
  111. debbieCon.readString();
  112. charlieCon.readString();
  113. try {
  114. Thread.sleep(1000);
  115. } catch (InterruptedException e) {
  116. e.printStackTrace();
  117. }
  118. debbieCon.stop();
  119. charlieCon.stop();
  120. } else if (party.equals("debbie")) {
  121. Communication eddieCon = new Communication();
  122. InetSocketAddress eddieAddr = new InetSocketAddress(eddieIp, eddiePort1);
  123. eddieCon.connect(eddieAddr);
  124. Communication charlieCon = new Communication();
  125. charlieCon.start(debbiePort);
  126. System.out.println("Waiting to establish connections...");
  127. while (eddieCon.getState() != Communication.STATE_CONNECTED)
  128. ;
  129. while (charlieCon.getState() != Communication.STATE_CONNECTED)
  130. ;
  131. System.out.println("Connection established");
  132. eddieCon.setTcpNoDelay(true);
  133. charlieCon.setTcpNoDelay(true);
  134. eddieCon.write("start");
  135. charlieCon.write("start");
  136. eddieCon.readString();
  137. charlieCon.readString();
  138. try {
  139. operationCtor.newInstance(eddieCon, charlieCon).run(Party.Debbie, configFile, forestFile);
  140. } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
  141. | InvocationTargetException e) {
  142. e.printStackTrace();
  143. }
  144. eddieCon.write("end");
  145. charlieCon.write("end");
  146. eddieCon.readString();
  147. charlieCon.readString();
  148. try {
  149. Thread.sleep(1000);
  150. } catch (InterruptedException e) {
  151. e.printStackTrace();
  152. }
  153. eddieCon.stop();
  154. charlieCon.stop();
  155. } else if (party.equals("charlie")) {
  156. Communication debbieCon = new Communication();
  157. Communication eddieCon = new Communication();
  158. InetSocketAddress eddieAddr = new InetSocketAddress(eddieIp, eddiePort2);
  159. eddieCon.connect(eddieAddr);
  160. InetSocketAddress debbieAddr = new InetSocketAddress(debbieIp, debbiePort);
  161. debbieCon.connect(debbieAddr);
  162. System.out.println("Waiting to establish connections...");
  163. while (eddieCon.getState() != Communication.STATE_CONNECTED)
  164. ;
  165. while (debbieCon.getState() != Communication.STATE_CONNECTED)
  166. ;
  167. System.out.println("Connection established");
  168. eddieCon.setTcpNoDelay(true);
  169. debbieCon.setTcpNoDelay(true);
  170. eddieCon.write("start");
  171. debbieCon.write("start");
  172. eddieCon.readString();
  173. debbieCon.readString();
  174. try {
  175. operationCtor.newInstance(eddieCon, debbieCon).run(Party.Charlie, configFile, forestFile);
  176. } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
  177. | InvocationTargetException e) {
  178. e.printStackTrace();
  179. }
  180. eddieCon.write("end");
  181. debbieCon.write("end");
  182. eddieCon.readString();
  183. debbieCon.readString();
  184. try {
  185. Thread.sleep(1000);
  186. } catch (InterruptedException e) {
  187. e.printStackTrace();
  188. }
  189. eddieCon.stop();
  190. debbieCon.stop();
  191. } else {
  192. throw new NoSuchPartyException(party);
  193. }
  194. System.out.println(party + " exiting...");
  195. }
  196. }